3

したがって、私が作成しているプログラムは 2 つのスレッドを使用します。1 つは GUI 用で、もう 1 つは作業用です。

作業スレッド/クラスからの更新を、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();
}

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

1 に答える 1

1

まず、前述のとおり、GUI はイベント ディスパッチ スレッドでのみ実行する必要があります。

書かれているように、GUI クラスは 2 つのことを行います: それはフレームであり、ランナブルであり、両方が完全に独立して使用されます。実際のところ、GUI オブジェクトで "run" を呼び出すと、関連のない別の 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 に答える