2009-05-01 14 views
1

最新の安定版SWTを使用しています。SWTキャンバスロケーション

私は、ToolBar、ScrolledComposite、およびCanvasを含むシェルを持っています。 Canvasは、ScrolledCompositeのコンテンツとして設定されています(例:scrolledComposite.setContent(canvas))。キャンバスは決して変更されない特定のサイズ(たとえば、400×400)で作成されます。 ScrolledCompositeは、利用可能な親シェルのクライアント領域を満たすために絶えず成長しています。

親シェルにリサイズリスナを添付して、以下のことを試みます:a)上記のようにScrolledCompositeを拡大し、b)ScrollledComposite内でキャンバスを水平方向と垂直方向の両方に配置します。

これはMac OS Xの場合とまったく同じですが、Windowsではサイズ変更イベントが発生し、新しい場所が正しく計算されますが、最終的にキャンバスは0,0に戻ってスナップします。もう1つの小さな情報は、ウィンドウのサイズを連続的に変更すると、キャンバスがちらつくのを見ることができ、あたかも正しい場所に短く描かれているかのように見えるということです。

_shell.addListener (SWT.Resize, new Listener() { 
    public void handleEvent (Event e) 
    { 
     int toolBarOffset = _toolBar.getSize().y; 

     Rectangle clientArea = _shell.getClientArea(); 

     _scrollComposite.setBounds(0, toolBarOffset, clientArea.width, clientArea.height - toolBarOffset); 

     Point canvasSize = _canvas.getSize(); 

     int canvasX = Math.max(0, (clientArea.width/2) - (canvasSize.x/2)); 
     int canvasY = Math.max(0, ((clientArea.height - toolBarOffset)/2) - (canvasSize.y/2)); 

     _canvas.setLocation(canvasX, canvasY); 
    } 
}); 

答えて

1

あなたはすでにそれを考え出したが、問題はそれがサイズ変更されたときにScrolledCompositeは常に0/0にコンテンツを設定していることである場合はわかりません。あなたのアプローチがOS X上で動作する理由はわかりません。私はここでMacを持っていないので、私の例をテストしていません。

解決策は、少なくともScrolledCompositeのクライアント領域と少なくとも同じ大きさのフィラーコンポジットを使用することです。そのフィラーでは、Canvasを正しく中央に配置できます。

私は

(私が最初にそれが:)あなたの質問だと思ったので)SCのクライアント領域は、キャンバスよりも小さい場合追加ボーナスとして、それはまた、キャンバスを中心に、小さな例を作りました

あなたは若干の調整を加えなければならないかもしれませんが、OS Xのコードにはいくつかの不具合があると思います...

package test; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.ScrolledComposite; 
import org.eclipse.swt.events.ControlAdapter; 
import org.eclipse.swt.events.ControlEvent; 
import org.eclipse.swt.events.PaintEvent; 
import org.eclipse.swt.events.PaintListener; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.graphics.Rectangle; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Canvas; 
import org.eclipse.swt.widgets.Composite; 

import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class Test { 

    public static void main(final String[] args) { 
     final Display display = new Display(); 
     final Shell shell = new Shell(display); 

     shell.setLayout(new FillLayout()); 

     final ScrolledComposite sComp = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL); 
     final Composite fillComp = new Composite(sComp, SWT.NONE); 

     sComp.setLayout(new FillLayout()); 

     final Canvas c = new Canvas(fillComp, SWT.DOUBLE_BUFFERED); 
     c.addPaintListener(new PaintListener() { 
      public void paintControl(PaintEvent e) { 
       Point p = c.getSize(); 
       e.gc.setBackground(display.getSystemColor(SWT.COLOR_RED)); 
       e.gc.fillRectangle(0, 0, p.x, p.y); 

       e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE)); 
       e.gc.fillRectangle(p.x/2 - 10, p.y/2 - 10, 20, 20); 
      } 
     }); 

     c.setSize(400, 400); 
     sComp.setContent(fillComp); 

     sComp.addControlListener(new ControlAdapter() { 
      @Override 
      public void controlResized(ControlEvent e) { 
       Rectangle clientArea = sComp.getClientArea(); 

       Point cSize = c.getSize(); 
       int fillX = Math.max(clientArea.width, cSize.x); 
       int fillY = Math.max(clientArea.height, cSize.y); 
       fillComp.setSize(fillX, fillY); 

       int cX = (clientArea.width - cSize.x)/2; 
       int cY = (clientArea.height - cSize.y)/2; 

       sComp.setOrigin(-cX, -cY); 

       int locX = Math.max(cX, 0); 
       int locY = Math.max(cY, 0); 
       c.setLocation(locX, locY); 
      } 
     }); 

     shell.open(); 
     shell.pack(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
    } 
}