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
的类来编写自定义布局。最后有一个例子,我会做的。我知道这是可以选择的,但我试图避免它。我真的不知道为什么。谢谢你的链接。我知道你想避免代码中不必要的复杂性,但我认为在这种情况下没有其他方法。没问题,我希望这会有帮助。