Проблема с добавлением текста в JTextArea (добавление или установка текста)

Итак, программа, которую я делаю, использует 2 потока: один для графического интерфейса и один для выполнения работы.

Я хочу, чтобы обновления из рабочего потока/класса распечатывались в JTextArea в классе GUI. Все, что я пробовал, похоже, не сработало. Я добавил строки для вывода текста на консоль сразу после строк, чтобы добавить текст в JTextArea, чтобы убедиться, что он попал в строку, но каждый раз, когда консоль получала текст, но никаких изменений в 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();
}

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

РАБОТА.JAVA

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

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

person Emm    schedule 24.10.2012    source источник
comment
понятия не имею, как кто-то может вам в этом помочь, для лучшей помощи скорее опубликуйте SSCCE , короткий, исполняемый, компилируемый, только около JTextArea#append("String")   -  person mKorbel    schedule 24.10.2012
comment
Добро пожаловать на этот форум, пожалуйста, см. FAQ   -  person mKorbel    schedule 24.10.2012
comment
Хорошо, я постараюсь обрезать его достаточно, чтобы опубликовать   -  person Emm    schedule 24.10.2012
comment
Я не эксперт по Swing, но все, что я когда-либо видел, это сделать ваш графический интерфейс в Runnable вместо Thread. Я даже не могу сказать почему, но это только то, что я видел. Кто-то еще может прокомментировать, чтобы исправить меня.   -  person Andy    schedule 24.10.2012
comment
@Andy Runnable — это просто способ обернуть какую-то работу в классе. Поток напрямую связан с параллельным выполнением. В любом случае, в Swing все (связанное с графическим интерфейсом) должно выполняться в EDT (потоке диспетчеризации событий), и простой способ гарантировать, что ваш код запускается в EDT, состоит в том, чтобы обернуть его в Runnable и передать его SwingUtilities.invokeLater(Runnable). Это может заставить вас думать, что вам нужен Runnable, а не поток.   -  person Guillaume Polet    schedule 24.10.2012
comment
Вот пример.   -  person trashgod    schedule 24.10.2012
comment
Спасибо :) Теперь все работает нормально; как сделать так, чтобы на мой вопрос был дан ответ?   -  person Emm    schedule 25.10.2012


Ответы (1)


Во-первых, как уже было сказано, ваш графический интерфейс должен работать только в потоке диспетчеризации событий.

Как написано, ваш класс GUI делает две вещи: это фрейм и исполняемый, и оба используются совершенно независимо. На самом деле, вызов «run» для вашего объекта 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).

person khaemuaset    schedule 06.11.2012
comment
Хороший ответ. +1, особенно за Я бы также посоветовал избавиться от всех статических полей.. - person Andrew Thompson; 07.11.2012