IntelliJ отладчик не останавливается после добавления JFileChooser в мой проект - PullRequest
0 голосов
/ 24 сентября 2019

Конспект

Я занимаюсь разработкой проекта Java Swing и успешно отлаживаю в IntelliJ IDEA, выполнив метод main напрямую.После закрытия фрейма отладчик завершает работу нормально.

Однако после добавления в проект диалогового окна JFileChooser отладчик не завершается нормально.Мне приходится каждый раз нажимать кнопку остановки, что приводит к выходу JVM с ненулевым статусом.

Минимальный воспроизводимый пример

Это фрагмент кода, который вызываетпроблема;это ActionListener, который я добавляю к двум кнопкам, запускающим JFileChooser:

/**
 * Generic action listener that is used for both file selection dialog buttons
 */
private final ActionListener fileSelectionButtonActionListener = new ActionListener()
{
    @Override
    public void actionPerformed(final ActionEvent event)
    {
        final String target = ((JButton) event.getSource()).getName();
        assert (target.equals("file") || target.equals("directory"));

        JFileChooser fileChooser = new JFileChooser(new File(".").getAbsoluteFile());
        fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
        if(target.equals("directory")) {
            fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        }
        final int result = fileChooser.showOpenDialog(new JFrame());
        if(result == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            if(target.equals("file")) {
                fileTextField.setText(selectedFile.getAbsolutePath());
            } else {
                directoryTextField.setText(selectedFile.getAbsolutePath());
            }
        }
    }
};

Шаги отладки

Я попытался переместить создание JFrame из параметраметод showOpenDialog к объявлению переменной и добавлен frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);, но это не решило проблему.Это похоже на то, что кадр все еще висит в памяти, и именно поэтому JVM не закрывается.

Вопрос

Как правильно закрыть JVM при использовании JFileChooser?

1 Ответ

0 голосов
/ 24 сентября 2019

Проблема, действительно, в том, что JFrame все еще находится в памяти, вызывая зависание JVM.Однако решение - JFrame не требуется.

Вместо установки new JFrame() в качестве родителя диалогового окна, установите родительский элемент для самого диалогового окна:

/**
 * Generic action listener that is used for both file selection dialog buttons
 */
private final ActionListener fileSelectionButtonActionListener = new ActionListener()
{
    @Override
    public void actionPerformed(final ActionEvent event)
    {
        final String target = ((JButton) event.getSource()).getName();
        assert (target.equals("file") || target.equals("directory"));

        JFileChooser fileChooser = new JFileChooser(new File(".").getAbsoluteFile());
        fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
        if(target.equals("directory")) {
            fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        }
        final int result = fileChooser.showOpenDialog(fileChooser);
        if(result == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            if(target.equals("file")) {
                fileTextField.setText(selectedFile.getAbsolutePath());
            } else {
                directoryTextField.setText(selectedFile.getAbsolutePath());
            }
        }
    }
};

Измените строку, в которой вы получите результат: final int result = fileChooser.showOpenDialog(fileChooser);.Это устраняет проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...