【问题标题】:Java SWT GC not drawing text on CanvasJava SWT GC 不在 Canvas 上绘制文本
【发布时间】:2014-01-26 12:35:44
【问题描述】:

我有以下代码:

   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"); 不工作,但PaintListener 中的e.gc.drawText("String", 170, 30, true); 工作?

【问题讨论】:

  • 首先,这与垃圾收集无关,而是与 SWT 的 GraphicsContext 有关。其次,文本似乎被听众绘制的内容或画布的背景所覆盖。也许您可以尝试此introduction to SWT 中提供的SWT 标志之一

标签: java canvas garbage-collection swt drawtext


【解决方案1】:

每当需要重绘画布时,都会调用paintControl() 方法,这可能会发生任意多次。例如,PaintListener 在调整画布大小时使用(尝试在paintControl() 上放置断点,调整窗口大小,然后自己查看)。您需要做的所有绘图都应该在PaintListener中。

另外,你不应该在这里使用setBounds()。改用布局:

mainShell.setLayout(new FillLayout());

【讨论】:

  • 我在 PaintListener 之外绘制“测试”的原因是因为我需要能够将其从屏幕上移除,而我知道如何做到这一点的最佳方法是重新绘制画布。是的,我知道我应该使用布局,但这是一个更大的项目的一部分,其中每个小部件都有明确编码的边界。
  • 我认为你还是应该把绘图代码放在PaintListener 中,并弄清楚如何让它在你的代码逻辑中绘制你想要的东西。例如,如果需要绘制的内容取决于布尔值,则可以从paintControl() 中查看并绘制相应的内容。
  • 另外,setBounds() 通常在布局中使用。您可以通过编写扩展Layout 的类来编写自定义布局。 this page末尾有一个例子。
  • 我会这样做的。我知道这是可选的,但我试图避免它。我实在说不出理由。谢谢你的链接。
  • 我了解您希望避免代码不必要的复杂性,但我认为在这种情况下没有其他方法。没问题,我希望这会有所帮助。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 2011-06-08
  • 2020-02-15
  • 2021-03-14
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多