java - 尽管我们从另一个线程更新 GUI 组件,但没有遇到任何 GUI 卡住问题

标签 java multithreading swing swingworker

作为在 Java swing 上学习 SwingWorker 的一部分,我创建了一个简单的程序,其中不同的线程(EDT 除外)正在执行一些后台任务,完成后该线程正在更新 GUI 组件(JTextArea)。

据我所知,如果我们尝试从 EDT 之外的外部线程更新 GUI 组件,那么 UI 可能会被卡住。但这并没有发生。我真的很想创造这种情况(卡住 UI)以便更好地理解它。下面是我尝试过的代码。有人可以帮我说一下我需要对我的代码做什么,以免 UI 被卡住吗?

应用程序.java

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

public class App {

    public static void main(String[] args) {


        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MainFrame();
            }
        }); 

    }

}

MainFrame.java

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class MainFrame extends JFrame implements ActionListener {

    private JButton btn,btn2;
    private JTextArea txtArea;

    public MainFrame() {
        super("Hello World");

        setLayout(new BorderLayout());
        btn = new JButton("Click Me!");
        btn2 = new JButton("Click Me New!");
        txtArea = new JTextArea();
        btn.addActionListener(this);


        add(txtArea,BorderLayout.CENTER);
        add(btn,BorderLayout.SOUTH);
        add(btn2,BorderLayout.NORTH);

        setSize(600,800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {

        MyTestThread extThr = new MyTestThread();
        extThr.setBtnRef(txtArea);
        extThr.start();
    }

}

MyTestThread.java

import javax.swing.JTextArea;

public class MyTestThread extends Thread {

    private int i = 0;
    private JTextArea txtAreaRef;

    public void setBtnRef(JTextArea ta) {
        this.txtAreaRef = ta;
    }

    public void run() {

        while (i < 500000) {

            try {
                txtAreaRef.append("test"+i+"\n");
                i=i+1;
                sleep(2000);
            } catch (InterruptedException e) {System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }

    }

}

最佳答案

我不知道您从哪里获得该信息,但在 EDT 之外调用 GUI 更新不会导致 UI 卡住。

如果您想产生卡住,请尝试在 EDT 内创建无限循环,如下所示。

这将导致 UI 永久卡住。

    public void actionPerformed(ActionEvent e) {

            //MyTestThread extThr = new MyTestThread();
            //extThr.setBtnRef(txtArea);
            //extThr.start();

            while(true) {}
    }

关于java - 尽管我们从另一个线程更新 GUI 组件,但没有遇到任何 GUI 卡住问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205127/

相关文章:

iphone - 如何同步两个 NSManagedObjectContext

c# - ConcurrentDictionary ContainsKey 方法是否同步?

java - JOptionPane 在 JPanel 中不能正常工作

Java 2D 数组网格

java - 如何将用户输入添加到java中的并行数组?

python - Twisted 多线程,信号处理

java - 单击按钮时更新 JTable

java - 使用 Micronaut 提供静态资源,具有目录层次结构

java - 在没有任何 Swing 元素的情况下检测 JFrame 上的点击

java - 如何使用JAVA JFrame移动对象?