【发布时间】: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”出现在右下角很远,我需要调整窗口大小(使其变大)才能看到文本。