Java SwingWorker可能存在错误
使用Java SwingWorker可能存在错误,java,linux,multithreading,jlabel,swingworker,Java,Linux,Multithreading,Jlabel,Swingworker,使用SwingWorker顺序更新前端时,我想我可能发现了一个bug 我已经创建了一个侦听连接的服务器。连接可能只在几分钟内启动,因此我创建了一个小连接动画,在服务器等待新的传入连接时播放 SwingWorker用于每隔0.5秒用一个角色更新JLabel,该角色最终创建一个从面板一端反弹到另一端的角色,连接后,动画被删除,而JLabel用不同的文本更新 这一切都很顺利,但我最近意识到动画有时会冻结,但每次我运行动画时,它都会停止,并且JLabel会正确更新 然后我意识到当我在不同的工作区时,JL
SwingWorker
顺序更新前端时,我想我可能发现了一个bug
我已经创建了一个侦听连接的服务器。连接可能只在几分钟内启动,因此我创建了一个小连接动画,在服务器等待新的传入连接时播放
SwingWorker
用于每隔0.5秒用一个角色更新JLabel
,该角色最终创建一个从面板一端反弹到另一端的角色,连接后,动画被删除,而JLabel
用不同的文本更新
这一切都很顺利,但我最近意识到动画有时会冻结,但每次我运行动画时,它都会停止,并且JLabel
会正确更新
然后我意识到当我在不同的工作区时,JLabel
文本不会更新。(编辑:其中workspace指的是在Linux(我使用Linux Mint 15)中在桌面(工作区)之间切换的能力。请参阅: 我测试并重新测试: 测试A:
Jlabel
正确更新为新文本Jlabel
冻结,未更新为新文本JMenuItem
,它将与动画重叠,文本的重叠部分将部分更新为正确的文本public class ConnectingAnimation extends SwingWorker<Void, String> {
@Override
protected Void doInBackground() throws Exception {
StringBuilder sb = new StringBuilder();
while (true) {
while (!connected) {
try {
...
//Append text to StringBuilder
...
//publish updated text to be displayed next
publish(sb.toString());
//Sleep
Thread.sleep(100);
} catch (InterruptedException e) {
return null;
}
}
//Waits until clientConnected() is called
try {
synchronized (clientConnection) {
clientConnected.wait();
}
} catch (InterruptedException e) {
logger.logException(e);
}
}
}
@Override
protected void process(final List<String> chunks) {
for (final String update : chunks) {
if (connected) {
connectionStatusLabel.setText("Client Connected");
break;
}
connectionStatusLabel.setText(update);
}
}
}
什么是“工作区”?我想说工作区是存储“源”文件或所有文件的一个或多个目录,因为它们可能不仅仅是源代码。何时更新
connected
变量?它应该发生在synchronized(clientConnection)中的一个目录中
块,但我在其中都看不到它…“workspace”指Linux中的桌面工作区,如中所示,使用Ctrl+Alt和(箭头键)切换到其他桌面或工作区。@Holger connected变量已移动到clientConnect()方法以保持连续性
public static void clientConnected() {
...
synchronized (clientConnection) {
connected = true;
clientConnection.notify();
}
}