Проблема при вызове класса JFileChooser через другого класса

250
30 января 2018, 10:09

Всем привет. Разрабатываю проект в Eclipse на языке программирование Java. Проблема заключается в следующим: Создал класс FileChooser.java и основной класс Main.java. Написал код для FileChooser.java вот так:

public class FileChooser extends JPanel{
    private FileChooser(){
        final JFileChooser fileChooser = new JFileChooser();
        final JButton open = new JButton("Open");
        fileChooser.setCurrentDirectory(new File("C:/Users/Elmar/Desktop"));
        fileChooser.setDialogTitle("Choose Your Project");
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        if(fileChooser.showOpenDialog(open) == JFileChooser.APPROVE_OPTION){
        }
    }
    public static void main(String[] args){
        final FileChooser fileChooser = new FileChooser();
    }
}

При всем этом я вызываю метод main в классе Main.java таким образом

openProject.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        FileChooser.main(args);
    }
});`

И когда все готово я запускаю программу и при нажатие на кнопку Open программа зависает и перестает работать. Мне JFileChooser нужен в отдельном классе из-за этого я так написал код. Буду благодарен за помощь

Answer 1

Метод public static void main(String[] args){} - не совсем обычный метод. это, если можно так выразиться, точка входа в приложение, поэтому, пока не придет понимание происходящего, для простоты действуйте по правилу: "одно приложение один метод main". Посему попробуйте написать класс FileChooser без него:

import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
public class FileChooser extends JFileChooser{
    private static final long serialVersionUID = -2339847367533082834L;
    private final JButton openButton;
    public FileChooser(){
        openButton = new JButton("Open");
    }
    public void startFileChooser(){
        setCurrentDirectory(new File("C:/Users/Elmar/Desktop"));
        setDialogTitle("Choose Your Project");
        setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        if(showOpenDialog(openButton) == JFileChooser.APPROVE_OPTION){
            //после нажатия на кнопку выводит путь к выбранной директории
            System.out.println(getSelectedFile());
        }
    }
}

Разумеется, вместо FileChooser.main(args) следует сделать так: new FileChooser().startFileChooser().

Обратите также внимание на использование конструктора. Вы его используете, чтобы запустить логику. Так делать не стоит по многим причинам. Для этого существуют обычные методы. А конструктор по сути своей призван делать две вещи: создавать экземпляр класса и инициализировать поля.

Answer 2

Переименуй main во что то другое А ещё `

if(fileChooser.showOpenDialog(open) == JFileChooser.APPROVE_OPTION){
        }

ничего не делает.

READ ALSO
Невидимая кнопка

Невидимая кнопка

Помогите пожалуйста, столкнулся с непонятной проблемой: Всего есть 3 класca, мне нужно чтобы при переключении на class_0 или class_1 нажатая кнопка...

196
Создание List в Spring

Создание List в Spring

Выдает большой кусок текста об ошибке, но не могу понять в чем дело

287
сообщение с сервера на Android клиент

сообщение с сервера на Android клиент

Собственно такой вопрос, каким образом мы можем отправить сообщение с сервера на Java на Андроид клиент? У меня нормально передаёт данные с Андроида...

209