2012-02-08 18 views
3

は、だから私は与えられた「モデル」に応じて、それは50個のピクセルの高さと、約84600ピクセルの長さで水平「タイムライン」のバーを生成するプログラムを書いた後、キャンバスは画像を生成し遮断します。各ピクセルは秒を表します。これは、24時間の間に数秒でイベントをモデリングするためです。SWT ScrolledCompositeは32768個のピクセル

問題は、32768ピクセル後にバーが切り取られていることです。

私は、スクロールバーがバッファリングによってドラッグされたときに新しいデータが表示されている間にキャンバスの一部だけを表示し、そのスクロールを行うようにスクロールコンポジットを使用するなどのソリューションを読んだが、すべて。

私が見たもう一つの解決策は、スクロールバーがスクロールバーがスクロールしてキャンバス全体が表示されないという問題が明らかになったときに、スクロールコンポジットを使用せずにキャンバスを使用することでした。この「解決策」のためのテストプログラムを以下に示す。助けてください!

package canvas; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.PaintEvent; 
import org.eclipse.swt.events.PaintListener; 
import org.eclipse.swt.graphics.Image; 
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.Display; 
import org.eclipse.swt.widgets.ScrollBar; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Event; 

public class Test { 
static int shellStyle = SWT.NO_REDRAW_RESIZE | SWT.NO_BACKGROUND | SWT.H_SCROLL; 
static int canvasStyle = SWT.NO_REDRAW_RESIZE;// | SWT.H_SCROLL | SWT.V_SCROLL; 

public static void main(String[] args) { 
    final Display display = new Display(); 
    final Shell shell = new Shell(display, shellStyle); 
    shell.setLayout(new FillLayout()); 
    shell.setBackground(display.getSystemColor((SWT.COLOR_CYAN))); 
    shell.setText("Canvas Test"); 
    Image image; 

    final Canvas canvas = new Canvas(shell, canvasStyle);  
    canvas.setLayout(new FillLayout()); 
    canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); 

    final Point origin = new Point(0,0); 
    final ScrollBar hBar = shell.getHorizontalBar(); 
    Rectangle size = canvas.getBounds(); 
    hBar.setMaximum(size.width); 
    hBar.setMinimum(0); 

    // Create a paint handler for the canvas 
    canvas.addPaintListener(new PaintListener() { 
     public void paintControl(PaintEvent e) { 
     // Do some drawing 
      e.gc.setBackground(display.getSystemColor(SWT.COLOR_DARK_YELLOW)); 
      e.gc.fillRectangle(100, 200, 100, 200); 

      e.gc.setBackground(display.getSystemColor(SWT.COLOR_DARK_CYAN)); 
      e.gc.fillRectangle(900, 200, 600, 200); 

      e.gc.setBackground(display.getSystemColor(SWT.COLOR_DARK_MAGENTA)); 
      e.gc.fillRectangle(500, 200, 300, 200); 

      e.gc.setBackground(display.getSystemColor(SWT.COLOR_GRAY)); 
      e.gc.fillRectangle(1600, 200, 300, 200); 
     } 

    }); 

// The below event handlers allow for horizontal scrolling functionality 
    hBar.addListener(SWT.Selection, new Listener() { 
     public void handleEvent(Event e) { 
      int x = 0; 
      int hSelection = hBar.getSelection(); 
      int destX = -hSelection - origin.x; 
      Rectangle rect = shell.getBounds(); 
      canvas.scroll(destX, 0, x, 0, rect.width, rect.height, false); 
      origin.x = -hSelection;  
      x = destX; 
     } 

    }); 

    shell.addListener(SWT.Resize, new Listener() { 
     public void handleEvent(Event e) { 
      Rectangle rect = canvas.getClientArea(); 
      Rectangle client = shell.getClientArea(); 
      hBar.setMaximum(rect.width); 
      hBar.setThumb(Math.min(rect.width, client.width)); 
      int hPage = rect.width - client.width; 
      int hSelection = hBar.getSelection(); 
      if (hSelection >= hPage) { 
      if (hPage <= 0) 
       hSelection = 0; 
      origin.x = -hSelection; 
      } 
      shell.redraw(); 
     } 
     }); 

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

} 
} 

編集:ありがとうp12t! ちょうど質問...この行: 最終的なポイントtimelineSize =新しいポイント(84600、50);

だから、これは50、y軸のピクセルがそこに「ポイント」は、すべてのx軸のピクセルのためであるが、ことを意味するのでしょうか?以下のような:++++++++++

。 。 。 。 。 。 。 。 。 。

そこで各「+記号は」水平x軸のピクセルであり、84600は、ダウン50のy軸のピクセルを示すように「期間」である「ポイント」。これについて私の理解は正しいのですか? (ところで、私は上記の例が示すされて10ポイント)私が間違って何をやっていたあなたの意見でも

?それとも私はそれが間違って..

答えて

1

Canvas#scroll(..)を使用すると、間違いなく行く方法です実装しました。私はあなたの例を0から84600までの尺度を描くように修正したので、それは32kの「物理的な」限界を超えています。

import org.eclipse.swt.SWT; 
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.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.ScrollBar; 
import org.eclipse.swt.widgets.Shell; 

public class Test { 
static int canvasStyle = SWT.NO_REDRAW_RESIZE | SWT.H_SCROLL; // | SWT.V_SCROLL; 

public static void main(String[] args) { 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 
    shell.setBackground(display.getSystemColor((SWT.COLOR_CYAN))); 
    shell.setText("Canvas Test"); 

    final Canvas canvas = new Canvas(shell, canvasStyle);  
    canvas.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); 
    canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); 

    final Point timelineSize = new Point(84600, 50); 
    final Point offset = new Point(0,0); 
    final ScrollBar hBar = canvas.getHorizontalBar(); 

    // Create a paint handler for the canvas 
    canvas.addPaintListener(new PaintListener() { 
     public void paintControl(PaintEvent e) { 
     for (int x = 100; x < timelineSize.x; x += 100) 
     { 
      e.gc.drawLine(x + offset.x, 0, x + offset.x, 20); 
      e.gc.drawText(Integer.toString(x), x + offset.x, 30, true); 
     } 
     } 
    }); 

// The below event handlers allow for horizontal scrolling functionality 
    hBar.addListener(SWT.Selection, new Listener() { 
     public void handleEvent(Event e) { 
      int hSelection = hBar.getSelection(); 
      int destX = -hSelection - offset.x; 
      canvas.scroll(destX, 0, 0, 0, timelineSize.x, timelineSize.y, false); 
      offset.x = -hSelection;  
     } 
    }); 

    canvas.addListener(SWT.Resize, new Listener() { 
     public void handleEvent(Event e) { 
      Rectangle client = canvas.getClientArea(); 
      hBar.setMaximum(timelineSize.x); 
      hBar.setThumb(Math.min(timelineSize.x, client.width)); 
      int hPage = timelineSize.y - client.width; 
      int hSelection = hBar.getSelection(); 
      if (hSelection >= hPage) { 
      if (hPage <= 0) 
       hSelection = 0; 
      offset.x = -hSelection; 
      } 
      shell.redraw(); 
     } 
     }); 

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

    } 
} 
関連する問題