ホームページ > Java > &#&チュートリアル > パズル ゲームで画像を追加または移動した後、JPanel が更新されないのはなぜですか?

パズル ゲームで画像を追加または移動した後、JPanel が更新されないのはなぜですか?

Patricia Arquette
リリース: 2024-11-28 18:36:11
オリジナル
565 人が閲覧しました

Why Doesn't My JPanel Update After Adding or Moving Images in a Puzzle Game?

パズル ゲームの JPanel が更新されません

単純なパズル ゲームでは、タイルを表す画像がグリッド上にランダムに配置されます。各画像には、現在の位置と目的の位置を示す「場所」属性と「番号」属性があります。ゲーム ロジックは、「番号」が一致する画像を正しく交換し、その「場所」属性を更新します。ただし、更新された画像を JPanel に追加しても、表示されるグリッドは更新されません。

この問題に対処するには、JPanel を適切に更新するように addComponents() メソッドを変更します。

public void addComponents(Img[] im){
    this.removeAll();
    for(int i=0; i<16; i++){
        im[i].addActionListener(this);
        im[i].setPreferredSize(new Dimension(53,53));
        add(im[i]);
    }
    // Explicitly revalidate and repaint the JPanel
    this.revalidate();
    this.repaint();
}
ログイン後にコピー

revalidate() と repaint() を呼び出すことで、JPanel に強制的にレイアウトを再計算させ、新しい値で表示を更新します。

代わりに、より効率的なアプローチを利用する次のコード例を検討してください。

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.WindowConstants;

public class PuzzleGame {

    private static final int N = 4;
    private final JPanel panel = new JPanel(new GridLayout(N, N));
    private final JButton[][] buttons = new JButton[N][N];
    private final BufferedImage image;

    private PuzzleGame() throws IOException {
        image = ImageIO.read(new File("image.jpg"));
        createButtons();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        
        // Timer to simulate image swapping
        Timer timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                shuffleButtons();
            }
        });
        timer.start();
    }

    private void createButtons() {
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                buttons[i][j] = new JButton();
                buttons[i][j].setPreferredSize(new Dimension(50, 50));
                int w = image.getWidth() / N;
                int h = image.getHeight() / N;
                BufferedImage subImage = image.getSubimage(j * w, i * h, w, h);
                buttons[i][j].setIcon(new ImageIcon(subImage));
                panel.add(buttons[i][j]);
                buttons[i][j].addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JButton b = (JButton) e.getSource();
                        // Swap logic here
                    }
                });
                count++;
            }
        }
    }

    private void shuffleButtons() {
        Container parent = panel.getParent();
        if (parent != null) {
            panel.remove(buttons[0][3]);
            parent.add(buttons[0][3], 0);
        }
        // Update the UI
        panel.revalidate();
        panel.repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new PuzzleGame();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
ログイン後にコピー

このコードは、スライスされた画像ボタンを作成し、それを 4x4 グリッドに保存します。右上のボタンを最初の位置に移動すると、タイマーによって画像のシャッフルが開始されます。 revalidate() メソッドと repaint() メソッドにより、ボタンが移動するたびに UI が正しく更新されます。

以上がパズル ゲームで画像を追加または移動した後、JPanel が更新されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート