у меня есть флажок, и я хочу
Ниже приведено событие: -
final JCheckBox rfh = new JCheckBox("Auto Refresh");
toolbar.add(rfh);
toolbar.setAlignmentX(0);
rfh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
while ( rfh.isSelected() ) {
if (rfh.isSelected()) {
// ((JCheckBox)evt.getSource()).isSelected()
JOptionPane.showMessageDialog(toolbar,"thank you for using java");
Thread.sleep(5 * 1000);
} else {
JOptionPane.showMessageDialog(toolbar,"not selected");
}
}
} catch (Exception e) {
}
}
});
Начнем с рассмотрения:
В принципе, Swing - это однопоточная среда, поэтому не пытайтесь использовать цикл и Thread.sleep
в методе ActionPerformed
.
Два простых решения будут либо...
Timer
Swing Timer
Swing позволит вам настроить регулярный запланированный вызов. Этот обратный вызов будет выполнен в контексте потока Dispatching Event, что отлично подходит для обновления пользовательского интерфейса.
Его можно легко запустить и остановить.
Обратный вывод - это уведомление в контексте EDT, что делает его плохим выбором для совершения вызовов в базу данных, что может заставить программу "заикаться" каждый раз, когда она вызывается...
SwingWorker
SwingWorker
предоставляет средства для выполнения работы в фоновом режиме, но обеспечивает функциональность, позволяющую легко обновлять пользовательский интерфейс.
В принципе, вам нужно настроить какой-то цикл (в рамках рабочего метода doInBackground
) и использовать Thread.sleep
для ожидания Thread.sleep
периода времени. Как только Thread.sleep
вернется, вы сделаете свой звонок в базу данных, построили свою модель данных и передали ее методу publish
.
В рамках метода process
, который вызывается в контексте EDT, вы обрабатываете эти результаты и обновляете свою модель таблицы соответственно...
Недостатком этого является то, что вам нужно будет разработать средства, с помощью которых рабочий может быть остановлен (или выключен) и, если вы так склонны, перезапущен...
[java] [swing] timer
... Я сам выложил несколько сотен примеров