Java SWT GC未在画布上绘制文本
我有以下代码:Java SWT GC未在画布上绘制文本,java,canvas,garbage-collection,swt,drawtext,Java,Canvas,Garbage Collection,Swt,Drawtext,我有以下代码: final Canvas canvas = new Canvas(mainshell, SWT.NO_REDRAW_RESIZE); canvas.setBounds(0, 0, mainshell.getSize().x, mainshell.getSize().y); canvas.setBackgroundImage( new Image(display, "BlueBack.jpg" )); canvas.setFont(font)
final Canvas canvas = new Canvas(mainshell, SWT.NO_REDRAW_RESIZE);
canvas.setBounds(0, 0, mainshell.getSize().x, mainshell.getSize().y);
canvas.setBackgroundImage( new Image(display, "BlueBack.jpg" ));
canvas.setFont(font);
GC gc = new GC(canvas);
gc.drawText("Test", 0, 0, true);
gc.dispose();
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawText("String", 170, 30, true);
e.gc.drawText("Another Unimportant String", 80, 90, true);
int I = 140;
int i = 1;
String[] strings = Stuff.getUnimportantStringArray();
if(strings != null)
for(String string : strings){
e.gc.drawText( i + " " + string , 120, I, true);
I += 50;
i++;
}
}
});
我遇到问题的代码是:
GC gc = new GC(canvas);
gc.drawText("Test", 0, 0, true);
gc.dispose();
gc.drawText()
没有像我预期的那样在画布上绘制字符串“Test”
我的问题是:
为什么gc.drawText(“Test”,0,0,true”);
不工作,但是e.gc.drawText(“String”,170,30,true);
内部的PaintListener
正在工作?paintControl()每当画布需要重新绘制时,就会调用
方法,这种情况可能发生多次。例如,调整画布大小时会使用PaintListener
(尝试在paintControl()
上放置断点,调整窗口大小,然后自己查看)。所有需要绘制的图形都应该在PaintListener
中
此外,此处不应使用setBounds()
。请改用布局:
mainShell.setLayout(new FillLayout());
首先,这与垃圾收集无关,而是与SWT的GraphicsContext有关。其次,文本似乎会被侦听器绘制的内容或画布的背景覆盖。也许您可以尝试此测试中提供的
SWT
标志之一“我绘制的原因”测试“在PaintListener之外是因为我需要能够将其从屏幕上移除,而我知道的最好的方法是重新绘制画布。是的,我知道我应该使用布局,但这是一个更大项目的一部分,在这个项目中,每个小部件都有显式编码的边界。我认为您仍然应该将绘图代码放入PaintListener
,并解决如何让它在代码逻辑中绘制您想要的内容。例如,如果需要绘制的内容取决于布尔值,则可以从paintControl()
中进行检查并绘制适当的内容。此外,setBounds()
通常在布局中使用。您可以通过编写扩展layout
的类来编写自定义布局。最后有一个例子,我会做的。我知道这是可以选择的,但我试图避免它。我真的不知道为什么。谢谢你的链接。我知道你想避免代码中不必要的复杂性,但我认为在这种情况下没有其他方法。没问题,我希望这会有帮助。