Переместите эти строки ..
JFileChooser b = new JFileChooser("C:\\");
b.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
.. из метода выполненного действия в конструктор слушателя действия, измените их на ..
b = new JFileChooser("C:\\");
b.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
.. затем объявите..
private JFileChooser b;
.. как атрибут класса (чтобы он был виден методу выполняемого действия).
Возможно, вы также захотите дать ему лучшее имя.
Селектор будет создан при создании класса и будет готов к использованию при необходимости.Это дает дополнительное преимущество, заключающееся в том, что выборщик запоминает позицию, размер, путь и тип отображения файла, при последующем нажатии кнопки пользователем.
Еще одна стратегия заключается в объявлении выбора как класса.атрибут не создает его в конструкторе, а проверяет выполненное действие, если оно null
, и, если это так, создайте и настройте его.
Продолжение..
Возможно, в какой-то момент я захочу сделать что-то более медленное, что не заслуживает отдельного потока.
С последней стратегией, которую я обрисовал в общих чертах, я собирался добавить кое-что, что добавлю сейчас.
.. Продолжение
.. Конечно, этот последний методвызовет ту же проблему, что и вы, но только один раз, когда пользователь нажмет кнопку.В этой ситуации вам, вероятно, стоит поискать JOptionPane
с неопределенным JProgressBar
изнутри SwingWorker
.
Очевидно, что SwingWorker
создает новый Thread
, но OTOH, Thread
объекты в Java дешевы.Есть несколько из них, работающих для любого приложения.с графическим интерфейсом.Еще пара не повредит.