Java 的 SWT:GC 不会在 canvas 上绘制简单的矩形,但会在图像上绘制它
Java's SWT: GC will not draw simple rectangle on a canvas, but will draw it on an image
我无法让 GC(图形上下文)对象在 canvas 上绘制一个简单的矩形,而且我不知道我错过了什么...
考虑这个简单的代码片段:
public class MainWindow {
private Display display;
private Shell shell;
public static void main(String args[]) {
MainWindow mw=new MainWindow();
mw.render();
}
public MainWindow() {
display=Display.getDefault();
shell=new Shell(display, SWT.DIALOG_TRIM);
shell.setText("Graphic Test");
shell.setSize(400,300);
shell.setLocation(0, 0);
GC gc=new GC(shell);
gc.drawRectangle(50,50,45,45);
gc.dispose();
}
public void render() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
这不会绘制任何东西:
这也不会:
public class MainWindow {
private Display display;
private Shell shell;
public static void main(String args[]) {
MainWindow mw=new MainWindow();
mw.render();
}
public MainWindow() {
display=Display.getDefault();
shell=new Shell(display, SWT.DIALOG_TRIM);
shell.setText("Graphic Test");
shell.setSize(400,300);
shell.setLocation(0, 0);
Canvas canvas=new Canvas(shell, SWT.NONE);
canvas.setSize(shell.getSize().x, shell.getSize().y);
GC gc=new GC(canvas);
gc.drawRectangle(50,50,45,45);
gc.dispose();
}
public void render() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
但是当我用背景图片设置 canvas 并在图片上作画时,看看会发生什么:
public class MainWindow {
private Display display;
private Shell shell;
public static void main(String args[]) {
MainWindow mw=new MainWindow();
mw.render();
}
public MainWindow() {
display=Display.getDefault();
shell=new Shell(display, SWT.DIALOG_TRIM);
shell.setText("Graphic Test");
shell.setSize(400,300);
shell.setLocation(0, 0);
Image background=new Image(display, "background.jpg");
Canvas canvas=new Canvas(shell, SWT.NONE);
canvas.setBackgroundImage(background);
canvas.setSize(shell.getSize().x, shell.getSize().y);
GC gc=new GC(background);
gc.drawRectangle(50,50,45,45);
gc.dispose();
}
public void render() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
突然,奇迹。 绘制矩形。
所以,它在图像上绘制没有问题,但是在 shell/canvas 上绘制不会产生任何东西...
我在这里错过了什么?我不应该可以在任何 Drawable 上绘图吗?
这是一个时间问题(在初始构造期间在 Canvas
或 Shell
上绘制将在后续绘制过程中过度绘制,而在 Image
上绘制会坚持您的绘制操作在它的 ImageData
中)。对于 Canvas
(或 Shell
),您应该在其绘制事件期间绘制,如 tutorial 所示。 PaintEvent
带来了自己的 GC
,这是管理绘图操作的正确方法:
final Canvas canvas=..;
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawRectangle(50,50,45,45);
}
});
我无法让 GC(图形上下文)对象在 canvas 上绘制一个简单的矩形,而且我不知道我错过了什么...
考虑这个简单的代码片段:
public class MainWindow {
private Display display;
private Shell shell;
public static void main(String args[]) {
MainWindow mw=new MainWindow();
mw.render();
}
public MainWindow() {
display=Display.getDefault();
shell=new Shell(display, SWT.DIALOG_TRIM);
shell.setText("Graphic Test");
shell.setSize(400,300);
shell.setLocation(0, 0);
GC gc=new GC(shell);
gc.drawRectangle(50,50,45,45);
gc.dispose();
}
public void render() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
这不会绘制任何东西:
这也不会:
public class MainWindow {
private Display display;
private Shell shell;
public static void main(String args[]) {
MainWindow mw=new MainWindow();
mw.render();
}
public MainWindow() {
display=Display.getDefault();
shell=new Shell(display, SWT.DIALOG_TRIM);
shell.setText("Graphic Test");
shell.setSize(400,300);
shell.setLocation(0, 0);
Canvas canvas=new Canvas(shell, SWT.NONE);
canvas.setSize(shell.getSize().x, shell.getSize().y);
GC gc=new GC(canvas);
gc.drawRectangle(50,50,45,45);
gc.dispose();
}
public void render() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
但是当我用背景图片设置 canvas 并在图片上作画时,看看会发生什么:
public class MainWindow {
private Display display;
private Shell shell;
public static void main(String args[]) {
MainWindow mw=new MainWindow();
mw.render();
}
public MainWindow() {
display=Display.getDefault();
shell=new Shell(display, SWT.DIALOG_TRIM);
shell.setText("Graphic Test");
shell.setSize(400,300);
shell.setLocation(0, 0);
Image background=new Image(display, "background.jpg");
Canvas canvas=new Canvas(shell, SWT.NONE);
canvas.setBackgroundImage(background);
canvas.setSize(shell.getSize().x, shell.getSize().y);
GC gc=new GC(background);
gc.drawRectangle(50,50,45,45);
gc.dispose();
}
public void render() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
突然,奇迹。 绘制矩形。
所以,它在图像上绘制没有问题,但是在 shell/canvas 上绘制不会产生任何东西...
我在这里错过了什么?我不应该可以在任何 Drawable 上绘图吗?
这是一个时间问题(在初始构造期间在 Canvas
或 Shell
上绘制将在后续绘制过程中过度绘制,而在 Image
上绘制会坚持您的绘制操作在它的 ImageData
中)。对于 Canvas
(或 Shell
),您应该在其绘制事件期间绘制,如 tutorial 所示。 PaintEvent
带来了自己的 GC
,这是管理绘图操作的正确方法:
final Canvas canvas=..;
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawRectangle(50,50,45,45);
}
});