0

1996 年以来、私は多くの Java コードを書いてきましたが、SWT を試したことはありません。最初は本当に簡単なものを選ぶつもりでしたが、私の前にいくつかの SWT/Jface/RCP の本があり、私の問題を解決するのに役立たなかったとしても、かなり早い段階で立ち往生してしまいました。

コマンド ライン アプリケーションを SWT ウィンドウで実行しようとしています。ユーザーからの入力は必要ありません。sysout を表示するだけで済みます。アプリケーションが 30 行を超える sysout を生成することはめったにありません。

public class TestGui implements Runnable {

private Display display;
private Shell shell;
private Text text;

public void run() {
    display = new Display();
    shell = new Shell(display, SWT.DIALOG_TRIM);
    shell.setText("SWT Test");
    shell.setSize(new Point(800, 400));
    shell.setLayout(new FillLayout());
    text = new Text(shell, SWT.MULTI | SWT.V_SCROLL | SWT.READ_ONLY);
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch())
            display.sleep();
    }
}

void addMessage(String s) {
    text.append(s);
    text.append("\n");
}

void close() {
    display.dispose();
}

public static void main(String[] args) {
    TestGui pr = new TestGui();
    pr.run();
    pr.addMessage("add some text");
    pr.close();
}
 }

これを実行すると、カーソルが安心して点滅しているウィンドウが表示されますが、他には何も表示されません。ウィンドウを閉じるまで addMessage() メソッドの呼び出しを実行できないようです。もちろん、それまでにシェルが破棄されるため、例外が発生します。

私は重要なステップを逃したと確信しています...

ありがとう

クリス

4

2 に答える 2

2

問題は、メソッドのwhileループがディスプレイが実際に破棄されるまで待機することです。したがって、この方法では、ディスプレイが破棄されたにのみメソッドを終了できます。runrun

私は SWT の専門家ではありませんが、whileループをmainメソッドに移動するか、呼び出しをメソッドに移動してみaddMessageてくださいrun。どのような方法でも、フレームが破棄されるのを待つ前にメッセージを追加する必要があります。

于 2013-02-09T16:06:37.883 に答える
0

私が投稿した元の例の問題は、返信で指摘されているように、メッセージを追加するコードが実行されなかったことです。そこで、別のスレッドをスピンオフして、そこからメッセージを呼び出しました。私はまだそれに取り組んでおり、すべてが正しく機能する時間があれば、更新を投稿します。

于 2013-03-07T11:17:17.320 に答える