我目前正在创建一个连接四游戏以获得乐趣,当我决定添加一个下降动画会很酷时,它就要完成了。我知道有几种不同的方法,但我不确定什么是“最好的”。
由于我的GUI由JComponents组成,我认为我应该使用javax.swing.Timer
来保护线程安全。
ActionListener update = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
};
};
Timer timer = new Timer(10, update);
timer.start();
我真正的问题是如何更新我的游戏板?
最好是调用repaint()
(甚至可能是repaint(Rectangle rec)
)并处理paint()
中的所有内容,或者为连接四件创建另一个类,并将该组件添加到我的GUI中。
我连接四件的另一课目前就是这个......
public class Piece extends JLabel{
private Color color;
private Ellipse2D circle;
public Piece(Color color, int radius) {
this.color = color;
circle = new Ellipse2D.Float(0, 0, radius, radius);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paintComponent(g2);
g2.setColor(color);
g2.fill(circle);
}
}
如果我将组件添加到GUI,我必须经常调用invalidate()
和validate()
,因为我目前的计时器速度很快,而且我不确定这是好还是坏而不是致电repaint()
。
我已经尝试了这两种方式,两者似乎都运行良好,我只是不确定哪种更有效?为了学习目的,我宁愿不要让它变得更加繁重。
如果有比我想象的更好的方式,请告诉我。我对所有建议持开放态度
答案 0 :(得分:1)
这将取决于。最简单的解决方案(从我的角度来看)是使用自定义绘画(使用repaint
并处理paintComponent
中的所有内容,因为它可以让您更好地控制图形层(IHMO)。
作为练习,你可以做到这两点。
基本上,它需要您(直接或间接)管理您自己的部件和板的布局管理器。
答案 1 :(得分:1)
你的作品是一个组成部分。您所要做的就是调用setLocation(...),组件将自动重新绘制。无需任何自定义绘画。
如果我将组件添加到GUI,我将不得不调用invalidate()和validate()
只需将布局设置为null即可。您需要设置组件的大小,但不需要调用invalidate()或validate(),因为布局管理器使用这些方法。