JFileChooser не умрет? - PullRequest
       21

JFileChooser не умрет?

1 голос
/ 02 декабря 2011

У меня есть JFrame, который открывает JFileChooser через событие действия.

Когда этот JFrame удаляется, а пользователь открывает новый и выбирает JFileChooser, он получает одно всплывающее окно JFileChooser для каждого JFrame, который когда-либо был открыт (и удален).

Это общая проблема?

btnBrowse.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {


                int returnVal = fc.showOpenDialog(null);
                fc.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    System.out.println("Opening: " + file.getAbsolutePath());
                    filets = file.getAbsolutePath();
                    String shortName = file.getName();
                            if(shortName.length() > 9 ){
                                String roar = shortName.substring(0, 9);
                                String shortErName = roar+"...";
                                btnBrowse.setText(shortErName);                             
                            }
                            else {
                                btnBrowse.setText(shortName);
                            }
                } else {
                    System.out.println("Error Getting File!");
                }

            }
        });

И моя кнопка просмотра:

btnBrowse.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {


                JFileChooser fc = new JFileChooser();

                int returnVal = fc.showOpenDialog(null);
                fc.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    System.out.println("Opening: " + file.getAbsolutePath());
                    filets = file.getAbsolutePath();
                    String shortName = file.getName();
                            if(shortName.length() > 9 ){
                                String roar = shortName.substring(0, 9);
                                String shortErName = roar+"...";
                                btnBrowse.setText(shortErName);                             
                            }
                            else {
                                btnBrowse.setText(shortName);
                            }
                } else {
                    System.out.println("Error Getting File!");
                }
            }
        });

Ответы [ 2 ]

3 голосов
/ 02 декабря 2011

Я представляю, что происходит, когда btnBrowse добавляет один из этих ActionListener каждый раз, когда вы создаете JFrame, но на самом деле ничего не удаляет этих слушателей. Если это тот же JButton, который сохранился при утилизации JFrame - то есть, если сама кнопка расположена в другом месте или если она просто член какого-то другого класса, и вы используете ее повторно, - это почти наверняка эта проблема.

Вы можете переопределить dispose() на JFrame и вызвать btnBrowse.removeActionListener(), чтобы избавиться от слушателя перед вызовом super.dispose().

0 голосов
/ 02 декабря 2011

не могли бы вы опубликовать еще немного кода (и оставить в стороне обработку имени файла?) О том, как вы создаете JFrame и JFileChooser? Я думаю, что вы избавляетесь от JFrame (как скрыть его от глаз), но не уничтожаете его. Таким образом, JButton с его ActionListener все еще жив (но просто не показан), и во втором запуске вы добавляете в него еще один ActionListener, поэтому, конечно, создается второй JFileChooser.

edit: некоторый код, объясняющий, что я имею в виду

JFrame myFrame = new JFrame();
JButton someButton = new JButton();
void addActionListenerToButton() {
   someButton.addActionListener(new ActionListener() {
       new JFileChooser().showOpenDialog(null);
   });
}

void handler() {
    myFrame.add(someButton);
    addActionListerToButton();
    myFrame.show();
    someButton.click(); // that method does not exist, it is meant as the user clicks.
    myFrame.dispose();
}

void main() {
    handler(); // thats the first run where one JFileChooser is seen
    handler(); // thats the second one, now you have two JFileChoosers.
}
...