質問

最初にラベルを持つ複合要素があります。今、私はそれ(ラベル)でdisposeを呼び出し、同じコンテナに別のラベルを作成します(複合elm)が、新しいテキストは表示されません。新しいラベル(または作成する可能性のある他のコンポーネント)が古いラベルの代わりにレンダリングされるように、コンポジットで再描画を有効にする方法を疑問に思います。 ここに私が持っているコードがあります(コンポジットを再描画するための単体テストに分けられています)

private Label createLabel( Composite parent) {
    Label label = new Label(parent, SWT.NONE);
    label.setAlignment(SWT.CENTER);
    label.setLayoutData( new GridData( SWT.CENTER, SWT.CENTER, true, true) );
    return label;
}

private void changeText() {
    assert testCell != null : "Please initialize test cell";
    testCell.getChildren()[0].dispose();
    Label l = createLabel(testCell);
    l.setText("New TexT");
    testCell.redraw();
}

private void draw() {
    Display display = new Display();
    shell = new Shell(display);
    shell.setLayout(new GridLayout(2,false));

    testCell = new Composite(shell,SWT.BORDER);
    testCell.setLayout(new GridLayout());
    Label l = createLabel(testCell);
    l.setText("Old Text");
    Composite btnCell = new Composite(shell,SWT.NONE);
    btnCell.setLayout(new GridLayout());
    Button b = new Button(btnCell, SWT.PUSH);
    b.setText("Change");
    b.addListener(SWT.MouseDown, new Listener() {
        public void handleEvent(Event e) {
            changeText();
        }
    });

ご覧のとおり、新しい要素を追加した後、コンポジットでredrawを呼び出しています。また、disposeの呼び出し後、testCell.getChildren()。lengthが期待どおり0を返し、新しいラベルを作成すると、同じ式が1を返すことを確認し、新しい要素が実際に取得されていることを確認しました親複合コンテナに追加されました ここに何か足りないのですか?

役に立ちましたか?

解決

changeText()関数では、

  

testCell.redraw();

行は

に置き換える必要があります
  

testCell.layout();

または、サイズを正しく変更する場合は、使用する必要があります

  

shell.layout();

他のヒント

ラベルにselectionListenerを追加します。

.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(final SelectionEvent e) {
        //Change text by Label.setText();
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top