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()andを呼び出す必要があり、 .validate()repaint()

私はこれらの方法の両方を試しましたが、どちらもうまくいくようですが、どちらがより効率的かわかりませんか? 学習目的のために、必要以上に負担をかけたくありません。

また、私が考えていた方法よりも良い方法があれば教えてください。私はすべての提案を受け入れます

4

2 に答える 2

1

あなたのピースはコンポーネントです。setLocation(...) を呼び出すだけで、コンポーネントが自動的に再描画されます。カスタムペイントは必要ありません。

コンポーネントを GUI に追加する場合、invalidate() と validate() を呼び出す必要があります。

レイアウトを null に設定するだけです。コンポーネントのサイズを設定する必要がありますが、これらのメソッドはレイアウト マネージャーによって使用されるため、invalidate() または validate() を呼び出す必要はありません。

于 2013-04-24T05:11:13.667 に答える
1

それは依存します。(私の観点から) 最も簡単な解決策は、カスタム ペインティングを使用することです (グラフィックス (IHMO) のレイヤーをより適切に制御できるため、 のrepaintすべてを使用して処理します)。paintComponent

演習として、両方を行うことができます。

基本的に、ピースとボード用の独自のレイアウト マネージャーを (直接的または間接的に) 管理する必要があります。

于 2013-04-24T05:06:19.237 に答える