3

所以我正在制作的程序使用 2 个线程:一个用于 GUI,一个用于工作。

我希望工作线程/类的更新在 GUI 类的 JTextArea 上打印出来。我尝试的一切似乎都不起作用。我在将文本添加到 JTextArea 的行之后添加了行以在控制台上打印出文本,以确保它已到达该行,但每次控制台获取文本但 GUI 中的 JTextArea 没有发生任何更改。

public static void consoleText(String consoleUpdate){
    GUI.console.append(consoleUpdate);
}

我在工作班上试过这个,但什么也没发生。有人知道如何解决我的问题吗?

编辑:

主程序.JAVA

public class main {
public static void main(String[] args) {
    Thread t1 = new Thread(new GUI());
    t1.start();
}

图形用户界面.JAVA

public class GUI extends JFrame implements Runnable{

public static JTextArea console;
private final static String newline = "\n";

public void run(){
    GUI go = new GUI();
    go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    go.setSize(350, 340);
    go.setVisible(true);
}

public GUI(){
setLayout(new FlowLayout());
console = new JTextArea(ConsoleContents, 15, 30);
add(console);
}

工作.JAVA

...{
consoleText("\nI want this text on the JText Area");
}

public static void consoleText(String consoleUpdate){
    GUI.console.append(consoleUpdate);
}
4

1 回答 1

1

首先,如前所述,您的 GUI 应该在事件调度线程上运行。

正如它所写的那样,您的 GUI 类做了两件事:它是一个框架和一个可运行文件,并且两者都完全独立使用。事实上,在您的 GUI 对象上调用“运行”会创建另一个不相关的 GUI 对象。这可能就是你什么都看不到的原因。

所以我建议你的主要内容如下:

... main(...) {
  SwingUtilities.invokeLater(new Runnable() {
      public void run() {
          GUI gui= new GUI();
          gui.setVisible(true); // and other stuff
      }
  });
}

(顺便说一句,我还建议摆脱所有“静态”字段。这可能是您的问题的根源,以及“运行”方法的奇怪位置)。

现在,我假设您从另一个线程调用的“consoleText”方法不应该直接修改文本,而是调用 SwingUtilities.invokeLater() 来这样做:

public void consoleText(final String consoleUpdate){
 SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      console.append(consoleUpdate);
    }
 });

}

(“最终”声明很重要,因为它允许 Runnable 使用 consoleUpdate 变量)。

于 2012-11-06T20:09:07.040 回答