【发布时间】:2012-12-10 02:28:54
【问题描述】:
我尝试了很多小时。我有一个线程可以更改我的 UI 的 JTextField,这完全破坏了 UI。线程(我们称之为线程 A)由 ActionListener 生成。 .setText() 函数调用在线程 A 创建的额外线程 (B) 中。线程 B 是 SwingUtilitis.invokeAll() 和/或 SwingUtilities.invokeAndWait() 的参数。我都试过了。这里有一些代码让它更清楚。
这是我创建线程 A 的 ActionListener - 当然缩短了:
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source == window.getBtn_Search()) {
Refresher refresh = new Refresher();
refresh.start();
}
}
这是我的线程 A,稍后将线程 B 放入 EDT 队列:
public class Refresher extends Thread implements Runnable {
private int counter = 0;
private UI window = null;
private int defRefresh = 0;
@Override
public void run() {
while(true){
-bazillion lines of code-
do {
try {
Refresher.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(window.canceled()) break;
UI.updateCounter(window.getLbl_Status(), (Configuration.getRefreshTime()-counter));
counter++;
} while (counter <= Configuration.getRefreshTime());
- more code-
}
}
}
UI.updateCounter(...) 会将线程 B 排队到 EDT。
public static void updateCounter(final JLabel label, final int i) {
try {
SwingUtilities.invokeAndWait(
new Runnable() {
public void run() {
label.setText("Refreshing in: " + i + " seconds.");
}
}
);
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
现在,当最后一个函数被调用时,一切都变得一团糟。我尝试了几个小时不同的东西,但没有任何效果。我也尝试过使用 SwingWorker,但有些或根本没有发生。
【问题讨论】:
-
还有……什么会“搞砸”?
-
我有一个 JPanel,其中包含多个较小的 JPanel,这些 JPanel 包含一个图标和多个 JLabel。当函数被调用时,这些 JLabel 出现在不同的地方,有些则完全消失。标签 window.getLbl_Status() 与这些无关,完全在其他地方。图标也会改变位置
-
label值的更改可能会影响其容器及其周围容器的布局 -
你需要为标签提供足够的空间,当它的文本发生变化时,它不想欺负其余的组件。一种厚颜无耻的方法是使用不可编辑的文本字段。取下它的板子,让它透明。
-
我想知道使用 JTable 然后更新它的模型而不是一堆 JLabel 是否会更好地为您服务。考虑告诉我们更多关于您的问题的信息。
标签: java multithreading swing user-interface event-dispatch-thread