我有复选框,我想要
以下是复选框事件: -
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) {
}
}
});
答案 0 :(得分:2)
首先看看:
基本上,Swing是一个单线程环境,所以不要试图在Thread.sleep
方法中使用循环和ActionPerformed
。
两个最简单的解决方案是......
Timer
Swing Timer
将允许您设置定期的预定回拨。此回调将在事件调度线程的上下文中执行,因此非常适合更新UI。
它可以轻松启动和停止。
退回是,它在EDT的上下文中被通知,这使得它成为调用数据库的不良选择,这可能导致程序在每次调用时“断断续续”......
SwingWorker
SwingWorker
提供了在后台执行工作的方法,但提供了可以轻松更新UI的功能。
基本上,您需要设置某种循环(在worker doInBackground
方法中)并使用Thread.sleep
等待一段规定的时间。一旦Thread.sleep
返回,您就可以调用数据库,构建数据模型并将其传递给publish
方法。
在EDT上下文中调用的process
方法中,您将处理这些结果并相应地更新您的表格模型......
这样做的缺点是你需要设计工人可以停止(或关闭)的方法,如果你这么倾向,重新启动...