swing如何在java中使用getWidth()和getHeight()将星形形状居中
我无法将星星形状居中。问题是我硬编码了每个坐标的点。问题是我没有得到正确的位置,尽管我创造了一个完美的五星。更多的问题是,如果我想通过单击按钮来重新缩放形状,使其变大或变小,该怎么办? 这是我的密码
public void run() {
DifferentShapes panel = new DifferentShapes();
JFrame frame = new JFrame("Different Shapes");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
frame.setVisible(true);
frame.add(panel);
frame.setJMenuBar(panel.getMenuBAr());
}
public void star(Graphics shape) {
// int sizeReq = 1;
int [] starX = new int[] {250, 262, 304, 268, 278, 250, 222, 232, 196, 238};
int []starY = new int[] {200, 236, 236, 254, 296, 272, 296, 254, 236, 236};
shape.fillPolygon(starX, starY, starX.length);
}
# 1 楼答案
你可能想考虑使用Shape Utils助手类来为你生成星,这样你就不需要手动计算恒星上的所有点。
基本上,使用该类只需要两行代码:
这将生成一个从中心到55到22像素的10个点交替的恒星
生成的第一个点将位于水平线上。由于有5个大点,这意味着它们将每72度生成一次。由于希望顶点位于垂直轴上,因此需要将所有点旋转-18度:
下面是一个简单的示例,展示了如何在面板中绘制居中的星星:
尝试使用带/不带旋转形状的代码查看差异
如果不想进行自定义绘制,那么可以使用上面链接中的
ShapeIcon
类。然后,您可以将星星视为图标,并将其添加到标签中:你可以:
ShapeUtils
类创建一个新形状# 2 楼答案
没有Shapes API
您可能会花费大量时间手动转换多边形数组,但更好的解决方案可能是将多边形转换为
0x0
,以便左上角位于0x0
基本上,我计算了每个数组的最小/最大值,然后从所有值中减去“最小”值
所以从
翻译成
当画出来的时候,看起来像
你可能在想,这不太好,我希望它在中心,但要进入中心,我们需要多边形的宽度和高度
为了实现这一点,我将转换后的数组传递给
minMax
方法,并使用返回值的第二个元素,它给了我一个108x96
(width
xheight
)的值,现在我们有了将形状居中所需的信息基本上,所有这些都是使用
maxWidth
和maxHeight
值来计算当前组件中的中心位置,将Graphics
上下文转换为适当的偏移量,并绘制多边形。平移会移动原点位置(即0x0
上下文的Graphics
点),从而允许用户更改多边形的绘制位置所以,关于你所知道的,你应该看到为你的形状使用
0x0
原点的重要性查看2D Graphics和Transforming Shapes, Text, and Images了解更多详细信息
缩放
可通过
Graphics2D#scale
进行缩放但这会缩放像素,这可能不会给出你想要的结果
在有人跳下我的喉咙之前,如果你想让它再次居中,你需要缩放
maxWidth
和maxHeight
值使用Shapes API
正如我在过去说过的,使用2D shapes API会获得更好的结果,它们是自包含的,很容易移动,当它们被缩放时,会得到更好的结果
例如,使用上面的“翻译”值,您应该创建一个很好的自定义、可重用的类
知道吗,我不知道你的情况,但这很容易阅读,而且你可以很容易地在一些图表纸上画出来
现在,通过做一些简单的事情就可以很容易地解决这个问题,比如
但是,等等,我们希望它以中心为中心,一切都变得简单
这比非形状API方法的代码要少得多
缩放
一般来说,缩放使用与转换相同的过程,但是,您得到的好处是,您可以缩放
Shape
,然后单独进行转换,允许您独立地获得缩放Shape
的Rectangle
边界。它还可以缩放矢量(点),而不是像素,这将给你一个更好的结果所以,简短的答案是,使用Shapes API,长的答案是,使用Shapes API,你不需要为你面临的每个问题重新设计轮子