Итак, я написал программу, которая в зависимости от заданной «модели» генерирует горизонтальную «шкалу времени» высотой 50 пикселей и длиной около 84600 пикселей.Каждый пиксель представляет секунду, поскольку он моделирует события в секундах в течение 24-часового периода.
Проблема в том, что после 32768 пикселей полоса обрезается.
Я прочитал такие решения, как использованиеScrolledComposite для отображения только части холста и выполнения этой прокрутки при отображении новых данных при перетаскивании полосы прокрутки с помощью буферизации, но я совсем не знаю, как это сделать.
Другое решение, которое я виделбыло без использования ScrolledComposite, но только с использованием canvas.scroll, если мой исходный код запущен (тестовая программа, чтобы проиллюстрировать мою проблему), проблема очевидна, что полоса прокрутки не прокручивается, чтобы позволить отображать весь холст, тестовая программа дляэто «решение» показано ниже.Пожалуйста помоги!
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);
Значит ли это, что есть «Точка» для каждого пикселя по оси X, но на 50 пикселей по оси Y вниз?Такие как: ++++++++++
.,,,,,,,,,
Таким образом, каждый знак «+» представляет собой горизонтальный пиксель по оси X, а 84600 «Точек» - это «периоды», как показано на 50 пикселей по оси Y вниз.Правильно ли мое понимание этого?(Кстати, пример, который я показал выше, иллюстрирует 10 баллов)
По вашему мнению, что я делал не так?Или я неправильно это реализовал ..