1

我有一个带有 CardLayout 组件的 JFrame。我正在使用 CardLayout 在应用程序执行的不同时刻在不同的 JPanel 之间切换。在某些时候,我使用 SwingWorker 对象来生成一些 XML 文件。这次我想在我的窗口中显示另一个 JPanel 来告诉用户等待。在这个 JPanel 上,我想在 3 个标签之间切换。

  • JLabel 1 将是:“请稍候。”
  • JLabel 2 将是:“请稍候..”
  • JLabel 3 将是:“请稍候...”

现在代码如下所示:

        ConvertersWorker.execute();
        CLayout.show(Cards, WAIT_PANEL);


        Timer t =new Timer(500, new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                WaitPanel.SwitchLabels();
            }               
        });
        t.start();

        while (!this.finishedConverting)
        {

        }
        //After this im am executing other methods based on the generated XML files

SwingWorker 代码:

SwingWorker<Boolean, Void> ConvertersWorker = new SwingWorker<Boolean, Void>() {
    public Boolean doInBackground() {
        Boolean result = RunConverters();
        return result;
    }
    public void done() {
        try {
            finishedConverting = get();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }
    }
 } ;

第二个 JPanel 甚至没有显示,因为 JFrame 阻塞。它由于 while 循环而阻塞,但我不知道如何以不同的方式实现它。SwingWorker 中的 done() 方法也永远不会执行。如果它被执行,那么finishedConverting 变量将被设置为true,while 循环将停止。谁能帮我找到更好的解决方案?

4

2 回答 2

1

我知道你解决了这个问题,但发生这种情况是因为你只使用了一个thread,并且它因为 而被阻止While,所以你需要创建一个新thread的来处理这个

new Thread(){  
  public void run() { 
    //code here
  }
}.start();

并刷新JPanel您可以使用的内容

myJpanel.doLayout();

或者

myJpanel.repaint();
于 2012-09-14T08:43:08.987 回答
0

我删除了while循环并将循环之后的代码移动到另一个方法中,该方法在done()方法中执行,SwingWorker所以现在它可以工作了。

于 2012-09-14T08:53:29.527 回答