【问题标题】:Trouble Adding text to JTextArea (append or settext)向 JTextArea 添加文本时遇到问题(追加或设置文本)
【发布时间】:2012-10-14 17:20:54
【问题描述】:

所以我正在制作的程序使用 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);
}

【问题讨论】:

  • 不知道如何帮助你,为了更好的帮助,请尽快发布SSCCE,简短,可运行,可编译,仅关于JTextArea#append("String")
  • 欢迎来到这个论坛,请see FAQ
  • 好的,我会尽量截断它以发布
  • @Andy Runnable 只是将一些工作包装在一个类中的一种方式。线程与并行执行直接相关。无论如何,在 Swing 中,所有事情(与 GUI 相关的)都应该在 EDT(事件调度线程)上执行,并且确保您的代码在 EDT 上运行的一种简单技术是将其包装在 Runnable 中并将其交给SwingUtilities.invokeLater(Runnable)。这可能会让您认为您需要的是 Runnable 而不是 Thread。
  • 这是example

标签: java swing append jtextarea settext


【解决方案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 变量)。

【讨论】:

  • 好答案。 +1 特别是 “我还建议摆脱所有“静态”字段..”
猜你喜欢
  • 2015-11-26
  • 2014-03-30
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多