Я создал форму с помощью визуального редактора Netbeans. Когда я нажимаю одну из кнопок, она должна делать следующее:
- отключи его
- выполнить задачу, которая требует некоторого времени
- когда задача завершится, кнопка снова станет активной
Однако происходит следующее:
- кнопка остается в нажатом состоянии, пока задача не завершится
- когда задача закончится, включение/отключение кнопок будет очень быстрым (они будут происходить, но вы их не заметите)
Такое поведение мне не нужно. Я пытался использовать перерисовку на JButton, на JFrame и даже на JPanel, содержащей кнопку, но я не могу заставить ее делать то, что я хочу. Некоторые намеки?
Решение проблемы
Когда вы работаете с обратным вызовом кнопки, вы останавливаете поток рисования графического интерфейса до его завершения.
Что вам нужно сделать, так это создать поток для выполнения длительной задачи, а затем использовать этот поток SwingUtilities.invokeLater()
для обновления пользовательского интерфейса после его завершения. Неиспользование invokeLater
не является потокобезопасным и, как правило, является плохим моджо.
Основной пример:
button.setEnabled(false);
new Thread(new Runnable() {
public void run() {
// Do heavy lifting here
SwingUtilies.invokeLater(new Runnable() {
public void run() {
button.setEnabled(true);
}
});
}
}).start();
Комментариев нет:
Отправить комментарий