麻烦添加文本到JTextArea(append或settext)

时间:2012-10-24 16:05:05

标签: java swing append jtextarea settext

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

我希望工作线程/类的更新能够在GUI类中的JTextArea上打印出来。 我尝试的一切似乎都没有用。我在行后面添加了一些行来打印文本,以便在JTextArea中添加文本以确保它已经到达行但是每次控制台都有文本但是GUI中的JTextArea没有发生任何变化。

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

我在工人阶级尝试了这个,但什么也没发生。 任何人都知道如何解决我的问题?

编辑:

MAIN.JAVA

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

GUI.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);
}

WORK.JAVA

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

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

1 个答案:

答案 0 :(得分:1)

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

正如编写的那样,你的GUI类做了两件事:它是一个框架,一个是runnable,两者都是 完全独立使用。事实上,在GUI对象上调用“run”会创建另一个不相关的GUI对象。这可能是你什么也看不见的原因。

因此,我建议您使用以下内容:

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

(我还建议摆脱BTW的所有“静态”字段。它可能是源头 你的问题,以及“跑”方法的奇怪之处。)

现在,我假设您从另一个线程调用的“consoleText”方法不应该 直接修改文本,但调用SwingUtilities.invokeLater()来执行此操作:

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

}

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