我正在处理一个包含大约十个不同数据源(例如statistics/error-log/...)的小程序。每个数据源由单个网络连接更新并通过观察器机制报告更新。小程序具有不同的视图,显示部分数据。每个视图只对数据的某些部分感兴趣,并将其自己注册为必要Obserbles中的Observer。在多线程环境中重绘
视图(扩展JPanels)主要由标准的摆动组件组成(例如JLabels,JButton,...)。视图中组件的某些属性取决于来自底层数据模型的信息。
例子:
StatisticPanel::paintComponent(Graphics g) {
clearStatisticButton.setEnabled(stat.hasEntries());
minValueLabel.setText(stat.getMinValue());
super.paintComponent(g);
}
这个逻辑在StatisticPanel的paintComponent()
方法来实现和update()
方法只是调用重绘(),因为我不想操纵EDT以外的成分。
这是在多线程环境中更新摆动组件的预期方式吗?与SwingUtitlies.invokeLater()
一起使用Runnable更好吗?这个问题有更好的方法吗?
+1深入查看代码。更改组件的属性将导致该组件再次被重新绘制。在某些情况下,这甚至可能会调用无限循环。 – camickr 2011-05-24 15:10:20
解决这个问题是否有最佳实践?因为如果我理解你是正确的,Swingutilties.invokeLater方法在不执行paintComponent()代码中的程序逻辑的意义上更好,但也有可能导致无限循环。 – tfk 2011-05-24 15:27:06
@tfk:参见**编辑1 **和**编辑2 ** – 2011-05-24 15:44:57