Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SwingWorker可能存在错误_Java_Linux_Multithreading_Jlabel_Swingworker - Fatal编程技术网

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:

  • 开始监听连接
  • 应用程序动画启动(由SwingWorker启动)
  • 在当前工作区中保持应用程序打开
  • 客户端连接,动画正确消失
  • Jlabel
    正确更新为新文本
  • 测试B:

  • 开始监听连接
  • 动画启动(由SwingWorker提供动力)
  • 按Ctrl+Alt(箭头键)移动到另一个工作区,并将应用程序保留在上一个工作区
  • 等待客户端连接并移回包含应用程序的工作区
  • Jlabel
    冻结,未更新为新文本
  • 这就是奇怪的地方:如果我选择一个
    JMenuItem
    ,它将与动画重叠,文本的重叠部分将部分更新为正确的文本
  • 我还没有在另一个Linux发行版上测试过这个问题,但是在我得到反馈说我的代码不是这个问题的原因之后,我会这样做

    代码:

    ConnectionAnimation将一直运行,但仅在服务器未连接时更新动画

    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();
        }
    }