Поэтому я в настоящее время занимаюсь некоторой работой с Multi-Threading в Java, и я довольно зациклен на, скорее всего, простой вещи.
В настоящее время у меня есть JButton, который при нажатии вызывает метод следующим образом:
private void clickTest() throws InterruptedException{
statOrganizer.incrementHappiness();
Thread t = new Thread(new Happiness(workspaceHappy));
t.start();
}
а затем занимает около 10-30 секунд. Однако в течение этого времени все еще можно повторно щелкнуть JButton так, чтобы он зависел от того, как отображается информация.
То, что я хочу сделать, - это время, когда этот конкретный поток "живой", отключите кнопку, чтобы ее больше не было возможно щелкнуть (и, таким образом, активировать этот поток, как только он уже будет). Как только поток закончен, я хочу снова включить кнопку.
Код кнопки выглядит просто так:
button.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 1) {
try {
clickTest();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Отключите кнопку перед запуском потока. В потоке в конце разместите событие, которое будет повторно активировать кнопку (с помощью invokeLater).
Вам также может потребоваться вариант отмены, но это отдельный вопрос.
Хорошим решением для этого является использование стеклянной панели для захвата всех событий и прекращения их распространения на любой из ваших элементов интерфейса на панели под стеклянным стеклом. Конечно, хотя у вас есть только один или два, вы можете называть их setEnabled(false)
вручную, но стеклянные панели дают вам больше гибкости, вам никогда не придется беспокоиться о добавлении нового элемента в свой пользовательский интерфейс и забыть отключить его во время фона обработка.
Наверное, слишком много для одной кнопки.
Другая, не связанная с этим вещь, которую вы должны учитывать, - это использование Executor
s вместо запуска потоков для фоновых задач. Это приводит к более чистым и масштабируемым кодам.
Попробуйте следующее:
button.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 1) {
try {
clickTest();
button.setEnabled(false);//this assume 'button' is final
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Затем измените метод run
вашего класса " Happiness
":
public void run()
{
//your processing code here
...
button.setEnabled(true);
//reference to button can be passed in constructor of Happiness
// or access using getter, ... This really depend on your implementation.
}
setEnabled(false)
должен отключить все нажатия на кнопку. Какая у вас ОС?