【问题标题】:Adding rendering offset to Frame将渲染偏移添加到 Frame
【发布时间】:2014-10-03 04:39:08
【问题描述】:

这里的场景是这样的:我正在使用 Frame 对象使用 AWT(无 Swing)进行一些较低级别的渲染。唯一的问题是,框架在直接渲染给它们时,不考虑它们的边界。因此,我们可能都知道,在 (0,0) 处渲染一个 Rectangle 看起来并不像是在做正确的事情。这是因为 (0,0) 是 Frame 的左上角。

所以问题是,而不是像这样添加要在屏幕上呈现的所有内容的 Frame insets:

//This is within the rendering method in the Frame subclass. A buffer strategy is already created
Graphics2D g = (Graphics2D)bufferStrategy.getDrawGraphics();
g.clearRect(0, 0, getWidth(), getHeight());
g.setColor(Color.WHITE);
Insets insets = this.getInsets();
g.drawString("FPS: " + getFPS(), 100 + insets.left, 100 + insets.top); //<-- Ugh.
g.dispose();

我希望能够简单地向框架的底层图形添加某种偏移量。这可能吗?需要明确的是,拥有这样的一些功能会很好:

g.setDrawingOrigin(x, y);

用这种方法,我可以逃脱谋杀。我不知道为什么不会有一个埋在某个地方......

注意:它是 Frame 而不是 JFrame,因此我们缺少可供参考的内容窗格。另一件事,最好避免将任何其他组件添加到框架中。我试图让它尽可能轻量级(因此,使用 Frame 而不是 JFrame。好吧,没有太大区别,但让我玩得开心:D)。

【问题讨论】:

  • 不是渲染到框架,而是使用组件并将您的自定义绘画绘制到它,然后它将放置在框架内
  • 我通常只是将 Canvas 扔到 Frame 上,然后让 pack() 方法完成所有工作。不过,我只是对这种特殊情况感到好奇。感谢您澄清这一点:D

标签: java awt java-2d insets


【解决方案1】:

直接来自 JavaDocs...

框架的大小包括为边框指定的任何区域。可以使用 getInsets 方法获得边框区域的尺寸,但是,由于这些尺寸与平台相关,因此在通过调用 pack 或 show 使框架可显示之前,无法获得有效的 insets 值。由于边框区域包含在框架的整体大小中,因此边框有效地遮挡了框架的一部分,从而将可用于渲染和/或显示子组件的区域限制在左上角位置为 (insets. left, insets.top),大小为宽度 - (insets.left + insets.right) x 高度 - (insets.top + insets.bottom)。

【讨论】:

  • +1 用于添加此位。很高兴看到它写出来
【解决方案2】:

你要找的方法是Graphic的translate(int, int)

所以你会打电话,

g.translate(insets.left, insets.top);

另一种方法是,您可以添加另一个适合并使用所有 Frame 空间的组件,而不是直接绘制到 Frame,然后在该子组件的 paint 方法中进行所有绘制,其中 x 和 y 位于您期望的位置.

【讨论】:

  • 哇。我不得不承认,这比我预期的要简单得多。我不知道为什么我没有早点想到,但是啊!谢谢!您添加另一个组件的建议非常明智,但我试图避免它。我可能有点挑剔,但它确实是用于概念验证设计。无论如何,谢谢!
  • @MrDoctorProfessorTyler 没问题。有时这些旧类的方法命名似乎很糟糕,所以有时最好打开该类的 Javadoc 页面并搜索关键字,例如本例中的词源。
  • 感谢您的建议。下次我一定会更深入地挖掘,然后再求助于这里
猜你喜欢
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
相关资源
最近更新 更多