4

SWT (標準ウィジェット ツールキット) と再描画に問題があります。基本的に、ボタンをクリックしたときに新しい要素が表示されるなど、何かが発生することを望んでいます。簡単にするために、ここではテキストにします。

ただし、ボタンをクリックしても何も起こらず、要素も表示されず、PaintEvent もトリガーされません。ウィンドウのサイズを変更すると、突然すべての要素が表示されます (paintEvent/再描画がトリガーされるため)。

ドキュメントとブログの投稿によると、何かを再描画する必要があるたびにペイント イベントがトリガーされます。アプリケーションに新しい要素を追加することは、そのカテゴリに分類されると考えました。

質問は次のとおりです。ここで何か間違ったことをしていますか? 再描画をトリガーするには、手動で layout()/redraw() を呼び出す必要がありますか? それは私には退屈に思えますが、私の理解では、ほとんどの場合、SWT がそれを処理してくれます。

ああ、SWT 4.2.2 で Linux x64 を実行しています。しかし、これはほぼすべてのプラットフォーム (および古い SWT 3.7) で利用できます。

そして、ここに私の小さなサンプルコードがあります:

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;

public class MainExample {

    public static void createText(Shell shell) {
      Text text = new Text(shell, SWT.SINGLE);
      text.setText("here is some fancy text");
    }

    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell (display);
        Button button = new Button(shell, SWT.PUSH);
        button.setText("I am a button");

        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                System.out.println("Button Clicked");
                // Why do these texts not show up and not trigger a Paint Event?
                createText(e.display.getActiveShell());
            }
        });

        createText(shell);
        shell.setLayout (new RowLayout());
        shell.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                // just triggered in the beginning and with resizes
                System.out.println("Hooray we got a Paint event");
            }
        });
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) display.sleep();
        }
        display.dispose();
    }

}

これは、その例を機能させることだけが目的ではないことに注意してください。これは、はるかに大きなプロジェクトの問題の単純なバージョンです:-)

どんな助けでも大歓迎です!

4

1 に答える 1

1

レイアウトを使用している場合は、コンポジットに新しい子を追加した後で Composite.layout() (または layout(true)) を呼び出す必要があります。レイアウトは、layout() を呼び出すまでわかりません (ウィジェットを配置しないでください)。

ちなみに、シェル(コンポジット)のサイズを変更すると、レイアウトは自動的に内部キャッシュを無効にし、すべての子をチェックして配置します。そのため、シェルのサイズを変更すると、新しく作成されたテキストが表示されます。

于 2013-07-06T12:07:51.000 に答える