【问题标题】:Draw Rectanlge perfectly centered in Java在Java中完美居中绘制矩形
【发布时间】:2011-06-05 22:35:17
【问题描述】:

我想在中间完美绘制的容器中绘制对象(包括放置组件)。

问题是,使用中间的 x 和 y 并减去/加上窗口宽度和高度的一半是不够的。

当我使用此代码绘制矩形时:

g.drawRect( 10, 10, this.getWidth() - 20, this.getHeight() - 20);

那么这将不起作用。使用上面的行,我想绘制一个四边都有 10 像素填充的矩形。 所以我从 10x10 开始,然后我取窗口的全宽和全高并减去 20,因为左侧是 10,右侧是 10。

在这种情况下,我应该得到一个完全居中的矩形,距离窗口边框 10 像素。

但是矩形的右边和底边在窗口之外,所以给drawRect方法的宽度和高度太高了。

我认为这来自 windows 边框。 点 0x0 不是您看到图纸的点。我猜 0x0 从窗口本身的左上角开始(不是绘图区域)。

所以在这种情况下,我需要知道绘图区域。类似于矩形的东西给了我需要开始绘图的坐标,所以我可以将我的坐标映射到 windows 坐标。

因此,当我想在 0x0(可见绘图区域)处绘制一个点时,必须将此点映射到 8x30 之类的位置。

我做了一个测试,添加了一个鼠标监听器,在鼠标移动时打印鼠标位置。当我将鼠标移动到绘图区域的最左上角位置时,我的应用程序会打印坐标 8x30。这意味着左边框的宽度为 8 像素,顶栏(显示窗口标题和关闭/最小化按钮)的高度为 30 像素。

我现在怎样才能让它工作。我想说一些类似的东西

g.drawRect( 10, 10, this.getWidth() - 20, this.getHeight() - 20);

所以即使我调整窗口大小时,我的矩形也会完美居中。

我认为当你尝试画这个时更容易理解我的问题:

Font font = g.getFont(); 
FontRenderContext frc = g.getFontMetrics().getFontRenderContext(); 
Rectangle2D rect = font.getStringBounds( "Hello", frc); 
g.drawString( "Hello", (int) ( this.getWidth() - rect.getWidth()), (int) ( this.getHeight() - rect.getHeight())); 

这需要文本“Hello”的大小,然后尝试在右下角打印它。代码是正确的,但文本“Hello”出现在右下角很远,我需要调整窗口大小(使其更大)才能看到文本。

【问题讨论】:

  • 你应该将宽度/高度除以 2,然后减去 5。像这样: g.drawRect(10, 10, this.getWidth()/2 - 5, this.getHeight()/2 - 5);
  • @Ricardo Ferreira:这是不正确的。这使我的矩形非常小,只占我窗口的 25%。为什么-5?调整窗口大小怎么样? -5 已经不够了。
  • 我认为当您尝试绘制此问题时更容易理解我的问题:Font font = g.getFont(); FontRenderContext frc = g.getFontMetrics().getFontRenderContext(); Rectangle2D rect = font.getStringBounds("你好", frc); g.drawString("你好", (int) (this.getWidth() - rect.getWidth()), (int) (this.getHeight() - rect.getHeight()));这需要文本“Hello”的大小,然后尝试在右下角打印它。代码是正确的,但文本“Hello”出现在右下角很远,我需要调整窗口大小(使其变大)才能看到文本。

标签: java center draw


【解决方案1】:

容器的getInsets() 方法应该提供绘制时需要应用的坐标偏移量。

这里是一些example code的链接。

【讨论】:

  • 这很有趣。我尝试通过从容器宽度中减去“右”值和从容器高度中减去“顶部”值来调整添加到 JFrame 的容器的大小。现在容器离观察区域只有一点点。所以还是不够。我忘了什么吗?代码: insets insets = this.getInsets(); mod.setSize(this.getWidth() - insets.right, this.getHeight() - insets.bottom);
  • 用这段代码好了,矩形正好在我窗口的边界: mod.setSize( this.getWidth() - 2 * insets.right, this.getHeight() - insets.top -插图。底部);所以我必须从高度中减去两倍的正确值和顶部和底部值。谢谢米佐
  • 我认为你也应该使用 insets.left: mod.setSize(this.getWidth() - insets.right - insets.left, this.getHeight() - insets.top - insets.bottom) ;
【解决方案2】:

您是直接在 JFrame 上绘图吗?如果您创建了一个 JPanel 来绘制并将 JPanel 添加到 JFrame 中会更容易。面板左上角的原点不会受到框架边框或标题栏的影响。

【讨论】:

  • 我使用容器。我在容器中完成所有绘画,然后将容器添加到 JFrame。还是同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2012-06-04
  • 2014-03-22
  • 1970-01-01
相关资源
最近更新 更多