1

我目前正在创建一个四人连线游戏来玩,当我决定添加一个下降动画会很酷时,我就快完成了。我知道有几种不同的方法可以做到这一点,但我不确定什么是“最好的”。

因为我的 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().

这两种方法我都试过了,似乎都可以正常工作,我只是不确定哪种方法更有效?为了学习的目的,我宁愿不要让它变得更繁重。

另外,如果有比我想象的更好的方法,请告诉我。我愿意接受所有建议

4

2 回答 2

1

这将取决于。最简单的解决方案(从我的角度来看)是使用自定义绘画(使用repaint和处理 中的所有内容paintComponent,因为它可以让您更好地控制图形图层(IHMO)。

作为练习,你可以两者都做。

基本上,它需要您(直接或间接地)管理您自己的棋子和棋盘布局管理器。

于 2013-04-24T05:06:19.237 回答
1

你的 Piece 是一个组件。您所要做的就是调用 setLocation(...) ,组件将自动重新绘制自己。无需任何定制绘画。

如果我将组件添加到 GUI,我将不得不调用 invalidate() 和 validate()

只需将布局设置为空。您需要设置组件的大小,但无需调用 invalidate() 或 validate(),因为布局管理器使用这些方法。

于 2013-04-24T05:11:13.667 回答