我正在使用Java制作平台游戏。我有一个带有图像图标的JLable形式的角色,可以使用箭头键移动它。我使用setBounds()方法来设置JLabel的位置,但是这个方法只将int值作为x和y参数,我想要更精确的控制。使用null布局,是否可以使用更精确的值(例如double)来定位JLabel?
感谢您的时间,祝您度过愉快的一天。
答案 0 :(得分:4)
如果您正在使用JLabels
,那么您正在使用Swing,而Swing具有非浮点坐标系统,所以不,你不能。
答案 1 :(得分:2)
Looking at the JavaDocs for JLabel
...
setLocation
将ints
作为参数。似乎没有办法使用小数点坐标。
答案 2 :(得分:1)
JavaFX可以做到。但是在Swing中,坐标是整数像素。
你可以在内存中绘制缩放的2x2(Image getGraphics),然后重新缩放以实现0.5的半整数步长;但这会模糊(内插像素)或闪烁(最近的匹配)。
对于缩放可缩放矢量图形,.vg,使用蜡染库是可行的。
对于文本子像素提示可以在某些LED屏幕上将黑色文本放在像素的三分之一上,具体取决于红色,绿色和蓝色子像素的布局。
一般来说,尝试以上操作是不值得的。除了 JavaFX 具有很好的动画支持,CSS样式和动画效果。
答案 3 :(得分:1)
正如其他人所说,UI组件的设计只能使用精确的像素坐标。
您可以在double
中存储位置,然后在实际设置位置时将其四舍五入为int
。像这样:
double velX = ..., velY = ...;
double x = ..., y = ...;
void example() {
int t = 1000 / 30;
new Timer(t, (ActionEvent e) -> {
x += t * velX;
y += t * velY;
label.setLocation((int) Math.round(x),
(int) Math.round(y));
}).start();
}
这样你可以以较小的增量移动。它只是不可见。
There is a really great example of animating an image here的方式非常类似于您要描述的内容。在我看来,尝试定位组件确实比它的价值更麻烦,特别是如果你想尝试做类似游戏的东西。执行自定义绘画更灵活。 (教程为here。)