2011-01-07 3 views
3

私はSplitLayoutPanelを持っています。ここで、子コンポーネントの1つはFlowPanelです。 FlowPanelには、サイズ変更が必要な子コンポーネントがあるので、FlowPanelを拡張して、ProvidesResizeとRequiresResizeを実装するResizableFlowPanelを作成しました。GWT:SplitLayoutPanelでonResize()を実行するときに新しいサイズを取得する方法は?

SplitLayoutPanelのスプリッタをドラッグすると、どのように子コンポーネントの新しいサイズを取得できますか?私はgetOffsetWidth()getElement().getOffsetWidthをFlowPanelから使ってみましたが、どちらも新しいサイズではなく元のサイズを返しています。

私は間違っていますか?ここで

は私がしようとしているFlowPanelサブクラスです:

class ResizableFlowPanel extends FlowPanel implements ProvidesResize, RequiresResize { 

    ResizableFlowPanel() { 
     super(); 
    } 

    public void onResize() { 
     int li_width = this.getOffsetWidth(); 
     int li_height = this.getOffsetHeight(); 
     System.out.println("ResizableFlowPanel:: width : " + li_width + "; height: " + li_height); 
     for (Widget child : getChildren()) { 
      if (child instanceof RequiresResize) { 
       ((RequiresResize) child).onResize(); 
      } 
     } 
    } 
} 

私はちょうど私はむしろ、ブレークポイントを使用するよりも、スプリッタを移動すると、ログ内の値を見るためのSystem.outを追加しました。それで、元のサイズが引き続きgetOffsetHeight()によって返されることを確認しました。

これは、FlowPanelおよび子パネルに対してもonResize()が呼び出されていることを確認します。 SplitLayoutPanelのスプリッタをドラッグしている間に境界が変更されていないかどうかを確認するためにFlowPanelにボーダーを追加してみました。

これは、RequiresResizeを実装するSplitLayoutPanelの子が実際にサイズ変更されるのはなぜですか?または、なぜ新しい幅と高さでonResize()が渡されないのですか?

答えて

3

私は、ウィジェットの実際の幅を取得するには時間がかかることに気付きました。 (ブラウザがまだそのすべてのレイアウト作業を終えていないかもしれません。) だから、あなたはさらにonResize()メソッドでは、タイマーを配置する必要があります。

public void onResize() { 
     new Timer() { 
      @Override 
      public void run() { 
       int width = ResizeContainer.this.getOffsetWidth(); 
      } 
     }.schedule(100); 
    } 

または繰延スケジューラを使用します。

public void onResize() { 
      Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { 
      @Override 
      public void execute() { 
       int width = ResizeContainer.this.getOffsetWidth(); 
      } 
     }); 
    } 

をしかし、私はタイマーやスケジューラなしであなたのコードを試して、それはブラウザやgwtバージョン関連の問題かもしれないように働いた...私はGWT 2.1.1とFirefox 3.6.12を使用します。

+0

ウィジェットがドキュメントに添付されると、サイズ計算を実行するために、通常はウィジェット#onLoad()をオーバーライドします。http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/ user/client/ui/Widget.html#onLoad() –

関連する問題