在执行其他方法时在单独的线程上更新GUI

时间:2017-12-19 16:26:39

标签: java swing user-interface

我有一个我开发的GUI,它有几个按钮和一个JTextArea用于输出。我在下面有一些代码执行一个函数并更新TextArea,但是在执行函数之前我希望TextArea用字符串" Processing..."来更新,只是为了给用户某种想法,应用程序正在运行,因为该函数需要一段时间才能执行。

目前这段代码没有更新GUI元素,我理解为什么。 GUI没有机会在改变TextArea的两个命令之间重新绘制,因此处理......"字符串永远不会显示。如何在Main.featureAnalysisTop()函数执行之前更改代码以便GUI元素更新?

if(e.getActionCommand().equals("Extract Features"))
            {                   
                featuresTextArea.setText("Processing...");
                int nFeatures = nFeatureSlider.getValue(); 
                Main.featureAnalysisTop(nFeatures);

                featuresTextArea.setText("");
                ArrayList<String> featureList = Main.getFeatureList();

                for(String str : featureList)
                {
                        featuresTextArea.append(str + "\n");
                }

使用以下代码在我的main方法中执行GUI。

public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    gui = new GUI2();
                    gui.setLocationRelativeTo(null);
                    gui.frmNeuralNetwork.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

1 个答案:

答案 0 :(得分:1)

  

在执行其他方法时在单独的线程上更新GUI

这是Swing Woker类的工作,它允许您创建一个在后台运行的单独线程,并允许您相应地更新GUI。

例如,我做了一个简单的例子来完成你想要做的事情。

首先我们创建GUI并在ActionListener之后添加JButton,在Swing Worker的文本更新为{{1当你试图这样做并且在5秒后(模拟你的长时间运行的任务)它会更新为JTextArea

您可以尝试并相应地更改代码。

processing...

参考文献:

这是另一个使用I'm done!的示例:update jlabel text after opening jdialog

希望有所帮助