【问题标题】:Java/Swing Print text from a child threadJava/Swing 从子线程打印文本
【发布时间】:2021-04-12 13:29:45
【问题描述】:

我有一个摆动框架,带有一个启动线程的按钮:

public class Frame extends JFrame {
    private static Frame frame= null;
    public static Frame getFrame(){
        return frame== null? frame= new Frame(): frame;
    }

    Thread worker;
    JTextArea  textarea = new JTextArea();
    JButton b = new JButton();

    Frame(){
        frameinstance = this;
        b.addActionListener(actionEvent -> {
            worker = new Thread(new myWorker());
            worker.start();
        });
        //...
    }
}

线程看起来像:

public class myWorker implements Runnable {
    public void run(){
        //Do some work
        Frame.getFrame().textArea.append("Some work has been done");
        //Do some work
       Frame.getFrame().textArea.append("Some work has been done");
        //etc...
    }

}

但文字实际上并没有显示为工作进度。

【问题讨论】:

  • 这看起来不像实际的代码,因为“myWorker”和“implements”之间没有空格。这甚至如何编译?什么是“全球”? getFrame 是一个函数吗?那为什么没有括号“(”和“)”?如果不是函数,为什么叫getFrame?此外,您遗漏了部分代码,因此我们不知道那里发生了什么。我认为你应该重新审视和编辑你的问题,尤其是你的代码。否则我不认为你会得到答案,很抱歉。
  • 我对我的项目进行了一些更改,以尽可能简短和精确。我纠正了错误。

标签: java multithreading swing text


【解决方案1】:

Swing 组件只能在event dispatch thread 上更新。大多数 Swing 组件都不是线程安全的,在其他线程中更新它们可能会产生不可预知的行为。

您可以使用 SwingUtilities.invokeLater(安排更新并继续)或 SwingUtilities.invokeAndWait(阻止直到处理事件)来更新 UI。

例如:

 SwingUtilities.invokeLater(()->Frame.getFrame().textArea.append("Some work has been done"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2011-02-03
    • 2012-12-29
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多