2016-04-11 10 views
1

私にはExpandBarがあり、その下に追加のコンポーネントがあります。以下は、私が働いているバージョンの簡単な例です:ExpandBarの下のすべてを設定して、展開/折りたたんだときにどのようにフォローすることができますか?

Initial state.

私はいくつかのサンプルからコピーしたExpandBarは、あり、そしてLabelはその下にあります。 ExpandBarを倒すと、Labelに従ってください。それを達成するために、私は次のようしている:

Shell after collapse.しかし

、私は再び拡大しようとすると、バーを展開するだけで構成されています。私は崩壊すると

bar.addExpandListener(new ExpandAdapter() { 
    @Override 
    public void itemCollapsed(ExpandEvent expandEvent) { 
     item0.setHeight(0); 
     shell.layout(); 
     super.itemCollapsed(expandEvent); 
    } 

    @Override 
    public void itemExpanded(ExpandEvent expandEvent) { 
     item0.setHeight(height); 
     shell.layout(); 
     super.itemExpanded(expandEvent); 
    } 
}); 

は、私が期待される結果を得ます私は問題のヘルプを見つけることを試みてきた

Expand Bar does not properly expand.

が、HAVI午前:スクロールバーとは、実際には展開されません。似たようなものを見つけるのは難しい。私はpack()layout()の仕組みを調べて、barオブジェクトを梱包してより良い結果を得ることができませんでした。

私が結果を達成するにはどうすればいいですか?つまり、折り畳んだ後、展開すると、GUIが最初の画像の状態に戻るはずです。

+0

あなたは[MCVE](http://stackoverflow.com/help/mcve)としてあなたのコードを投稿することができますか? – Baz

+0

なぜあなたは高さが足りないのか、レイアウトを自分で強制していますか?どのようなコンポジットとレイアウトがExpandBarとLabelの親ですか? – nitind

+0

'Composite'を拡張する' RowLayout() 'クラスです。フットウチなしでは、 'ExpandBar'は固定された高さを持ち、「折りたたまれている」場合はグレーの領域がいくつかあります。 – mike

答えて

1

エキスパンドバーの新しい状態が完全に実現される前にエキスパンド/折りたたみイベントが発生しているように見え、親を再レイアウトすると間違ったウィジェットの境界が使用されるようです。

私はasyncExec()でthelayoutコードを延期したことでこの問題を回避することができました。ここで

は私が使って実験に使用されるスニペットです:

public static void main(String[] args) { 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setLayout(new RowLayout(SWT.VERTICAL)); 
    ExpandBar bar = new ExpandBar(shell, SWT.NONE); 
    Composite composite = new Composite(bar, SWT.NONE); 
    composite.setBackground(display.getSystemColor(SWT.COLOR_YELLOW)); 
    ExpandItem item = new ExpandItem(bar, SWT.NONE, 0); 
    item.setText("First item"); 
    item.setHeight(200); 
    item.setControl(composite); 
    Label label = new Label(shell, SWT.NONE); 
    label.setText("text"); 

    bar.addExpandListener(new ExpandListener() { 
    @Override 
    public void itemExpanded(ExpandEvent event) { 
     relayout(); 
    } 

    @Override 
    public void itemCollapsed(ExpandEvent event) { 
     relayout(); 
    } 

    private void relayout() { 
     display.asyncExec(() -> { 
     bar.pack(); 
     shell.layout(); 
     }); 
    } 
    }); 

    shell.setSize(400, 350); 
    shell.open(); 
    while(!shell.isDisposed()) { 
    if(!display.readAndDispatch()) { 
     display.sleep(); 
    } 
    } 
    display.dispose(); 
} 
+0

私は非常に似たようなものを使って仕事をすることになりました、 'Display.getDefault()。timerExec(1、() - > {});'私はあなたのことがもっと好きだと思います。 – mike

関連する問題