2009-06-21 18 views
10

私はコンポジット要素を持っていますが、最初はラベルがあります。今私はそれをラベル(ラベル)で破棄し、同じコンテナ(複合エルメ)に別のラベルを作成しますが、新しいテキストは表示されません。新しいラベル(または作成する可能性のある他のコンポーネント)が古いラベルの代わりにレンダリングされるように、コンポジットに対してどのように再描画を有効にするかを質問します。あなたが見ることができるようにここで は私が持っているコード(コンポジットを再描画のためのユニットテストに分け)SWTコンポジット - 再描画の問題

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

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

changeText()機能で

答えて

22

あなたは私のサイズを変更したい場合は、

testCell.redraw();

ラインが

testCell.layout();

または、置き換えてください正しく使用する必要があります

shell.layout();

+2

() 'は何もしなかった。それは誰かのために役立つことがあります。 :) – mykola

+0

@mykola: 'shell.pack()'は私のウィンドウを小さくして再描画しましたが、 'shell.layout()'はそれを再描画してサイズを保持しました。私は 'shell.open()'の後にコントロールをウィンドウに追加していて、コントロールが表示されませんでした。 'shell.layout()'はそれを解決しました。 – gregn3

+0

layout()でjavadocが指定されていると、 'testCell.requestLayout();' – titou10

-5

ラベルにselectionListenerを追加するといいでしょう。このトピックを復活のため申し訳ありませんが、私は最近、同様の問題の解決策を模索し、このトピックでは、私は `shell.packを(使用していた私の窓のサイズを変更するが、多くのことを助けた)` shell.layout `ので

.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(final SelectionEvent e) { 
     //Change text by Label.setText(); 
    } 
} 
関連する問題