首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在执行其他方法时,在单独线程上更新GUI

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

Stack Overflow用户
提问于 2017-12-19 08:26:39
回答 1查看 1.2K关注 0票数 1

我已经开发了一个GUI,它有几个按钮和一个用于输出的JTextArea。下面有一些执行函数并更新TextArea的代码,但是在执行该函数之前,我希望使用字符串"Processing...“更新TextArea,这只是为了让用户知道应用程序正在工作,因为执行该函数需要一段时间。

目前,这些代码没有更新GUI元素,我理解其中的原因。GUI没有机会在更改TextArea的两个命令之间重新绘制,因此“处理.”字符串永远不会显示。如何更改代码,使GUI元素在执行Main.featureAnalysisTop()函数之前进行更新?

代码语言:javascript
运行
AI代码解释
复制
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");
                }

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

代码语言:javascript
运行
AI代码解释
复制
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();
                }
            }
        });
    }
EN

回答 1

Stack Overflow用户

发布于 2017-12-19 08:51:27

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

这是秋千炒锅类的一项任务,它允许您创建一个单独的线程,该线程在后台运行,并允许您相应地更新GUI。

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

首先,我们创建GUI并向我们的ActionListener添加一个JButton,它在将JTextArea的文本更新为processing...之后启动Swing Worker,然后在5秒后(这将模拟长期运行的任务)更新到I'm done!

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

代码语言:javascript
运行
AI代码解释
复制
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class TextAreaUpdater {
    private JFrame frame;
    private JTextArea area;
    private JButton button;
    private SwingWorker<String, String> worker;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TextAreaUpdater()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        area = new JTextArea(10, 30);

        button = new JButton("Update!");
        button.addActionListener(listener);

        worker = new SwingWorker<String, String>() {
            @Override
            protected String doInBackground() throws Exception {
                try {
                    Thread.sleep(5000); //Simulates long running task
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "I'm done!"; //Returns the text to be set on the JTextArea
            }

            @Override
            protected void done() {
                super.done();
                try {
                    area.setText(get()); //Set the textArea the text given from the long running task
                } catch (InterruptedException | ExecutionException e) {
                    e.printStackTrace();
                }
            }
        };

        frame.add(area, BorderLayout.CENTER);
        frame.add(button, BorderLayout.SOUTH);

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private ActionListener listener = (e -> {
        area.setText("Processing...");
        worker.execute(); //Initializes long running task
    });
}

参考文献:

下面是另一个使用SwingWorker的示例:打开j对话框后更新jlabel文本

希望它能帮上忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47891172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档