【问题标题】:SWT transformation bugSWT 转换错误
【发布时间】:2014-05-06 12:58:33
【问题描述】:

今天我遇到了 SWT 转换代码的一些奇怪行为。问题是,当我尝试使用 Transform.rotate(45f) 将坐标系旋转 45 度,然后绘制矩形的 outline 时,它绘制的矩形移动了。
考虑以下绘制旋转矩形的代码:

...
m_canvas.addPaintListener(new PaintListener()
    {

        @Override
        public void paintControl(PaintEvent a_e)
        {
            GC gc = a_e.gc;
            Transform t = new Transform(gc.getDevice());
            t.rotate(m_angle);
            gc.setTransform(t);
            gc.setForeground(fgcolor);
            gc.setBackground(bgcolor);
            gc.drawRectangle(rect);
        }

    });
...

此外,我们还有两个按钮,用于将角度增加和减少 1 度。现在使用该按钮将矩形从 0 度旋转到 90 度,看看 45 度左右会发生什么。
请注意,如果我尝试使用GC.fillRectangle(),则填充的矩形会旋转并正确绘制。 GC.drawRectangle() 方法的问题。

这就是它的样子:

类的完整代码可用here
带有 Eclipse 项目源的可运行 JAR(适用于 win32)将按要求发布,因为我没有足够的声誉。
是我做错了什么还是有解决此问题的方法?

【问题讨论】:

  • 这真的很好奇。可能值得将其发布为错误here

标签: java eclipse graphics rotation swt


【解决方案1】:

感谢 Baz,我找到了 2008 年发布的 bug report
不幸的是,没有解决方法,但有两种解决方法:

  • 在应用转换之后和绘制之前将 GC 数据状态掩码设置为 DRAW_OFFSET
    gc.getGCData().state |= 1 << 14;
  • 在 GC 上设置行属性:
    gc.setLineAttributes(new LineAttributes(1, SWT.CAP_FLAT, SWT.JOIN_MITER));

我以第二种方法结束,因为它被认为是一个独立于平台的解决方案。注意,构造函数参数不需要和上面一样。

【讨论】:

  • +1 很高兴看到您找到了“解决方案”。很遗憾看到仍然没有适当的修复。我的意思是,这是在这里不起作用的基本绘图......
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多