0

BorderLayoutContainer と 2 つの ContentPanel を使用して、水平分割可能なパネルを実装しました。

--------------------------------------------------
|  ContentPanel 1           |  ContentPanel2     |
|                           |                    |
| component 1 - component 2 |                    |
|                         <-|->                  |
|                           |                    |
|                           |                    |
--------------------------------------------------

このコードで:

public class WestCenter extends BorderLayoutContainer {

  private ContentPanel westPanel;
  private ContentPanel centerPanel;

  public WestCenter(){
    westPanel = new ContentPanel();
    centerPanel = new ContentPanel();

    BorderLayoutData westData=new BorderLayoutData(800);
    westData.setSplit(true);
    westData.setCollapsible(true);
    westData.setMinSize(300);
    westData.setMaxSize(2000);
    westData.setMargins(new Margins(0,5,0,0));

    BorderLayoutData centerData=new BorderLayoutData();
    setWestWidget(westPanel, westData);
    setCenterWidget(centerPanel,centerData);
  }
  ...
  //Getters, Setters etc...

}

問題 :

「コンポーネント 1」と「コンポーネント 2」が同じ行に収まらないようにバーをドラッグすると、高さの計算に問題が生じ、表示が正しくなくなります。

--------------------------------------------------
|  ContentPanel 1  |        ContentPanel2        |
|                  |                             |
| component 1      |                             |
| component 2    <-|->                           |
|                  |                             |
| *bad display for |                             |
| compos here*     |                             |
--------------------------------------------------

しかし

手動で 1px ずつ再ドラッグすると、表示は再び良好になります (「コンポーネント 1」と「コンポーネント 2」が 2 行であっても)。

質問

ContentPanel にそのコンテンツを再表示させるにはどうすればよいですか?

これまでのところ、私が見つけた唯一の方法は (非常に) 見苦しいものです: contentPanel にサイズ変更ハンドラーを追加して、幅を width-1 に設定します。

問題は、このハンドラーが別のサイズ変更イベントを生成し、無限ループが発生することです。しかし、タイマーの助けを借りて、この幅の変更によって表示の問題が解決されたことを検証しました。

westPanel.addResizeHandler(new ResizeHandler() {
  @Override
  public void onResize(final ResizeEvent event) {
    Timer t=new Timer(){
      @Override
      public void run() {
        westPanel.setWidth(westPanel.getOffsetWidth()-1);
      }
    };
    t.schedule(2000);
  }
});

何か案は?

4

0 に答える 0