は、だから私は与えられた「モデル」に応じて、それは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ポイント)私が間違って何をやっていたあなたの意見でも
?それとも私はそれが間違って..