Как обеспечить обратную связь с пользователем, чем была нажата кнопка, пока поток пользовательского интерфейса продолжает свою работу - PullRequest
0 голосов
/ 08 января 2012

У меня есть JButton, который запускает JFileChooser. Однако запуск JFileChooser часто занимает несколько секунд, в течение которых пользователь может подумать, что ничего не происходит. Я пытался сделать кнопку отключенной, пока JFileChooser не закончил, но отключение кнопки даже не происходит, пока не загружен JFileChooser. Есть ли что-то, что я могу сделать? Мой код:

public void actionPerformed(ActionEvent e) {
    System.err.println("clicked");
    ((JButton) e.getSource()).setEnabled(false);
    System.err.println("set");
    JFileChooser b = new JFileChooser("C:\\");
    b.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int res = b.showOpenDialog((Component) e.getSource());
    if (res == JFileChooser.APPROVE_OPTION) {
        try {
            //Blah
        }
        catch (Exception err) {
            JDialog j = new JDialog(window, "An error occured:\n" + err.getMessage());
        }
    }
    ((JButton) e.getSource()).setEnabled(true);
}

1 Ответ

3 голосов
/ 08 января 2012

Переместите эти строки ..

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 дешевы.Есть несколько из них, работающих для любого приложения.с графическим интерфейсом.Еще пара не повредит.

...