我在使用鼠标动作事件处理程序中刷新swing组件时遇到问题.问题是在jButton1MouseClicked()完成之后,在此函数中更改的所有jLabel都可以看到它们的更改.这是我的功能:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
int cycles = Integer.parseInt(c.settings.get("cycles"));
statusMessageLabel.setText("Data collection in progress...");
for(int i=1;i <= Integer.parseInt(c.settings.get("cycles"));i++) {
jLabelCycle.setText(Integer.toString(i));
//here are some functions which are implementing data collection
if(i < cycles){
int counter = Integer.parseInt(c.settings.get("interval"));
while(counter >= 0){
jLabelTimer.setText(Integer.toString(counter));
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(AppCView.class.getName()).log(Level.SEVERE, null, ex);
}
counter--;
}
}
}
statusMessageLabel.setText("Data collection has been finished.");
}
Run Code Online (Sandbox Code Playgroud)
你能帮我么 ?我真的需要这些更改可以立即显示,因为一个jLabel可视化计数到下一个周期,第二个可视化实际周期数.在我改变它们之后,我尝试在所有jLabel上调用函数repaint(),但它没有帮助.
谢谢大家的帮助.
在AWT中,与大多数其他GUI系统一样,包括重绘在内的所有事件都在一个线程上完成,即AWT事件调度线程(EDT).您在事件侦听器中阻止该线程,因此标签上的重绘事件无法通过.
我建议重写代码以使用javax.swing.Timer
而不是使用Thread.sleep
.
通常,长时间运行的操作应该在单独的线程上处理.任何涉及AWT或Swing组件的操作都应排队等待在AWT EDT上运行java.awt.EventQueue.invokeLater
.
归档时间: |
|
查看次数: |
758 次 |
最近记录: |