首頁 > Java > java教程 > 為什麼在益智遊戲中添加或移動圖像後我的 JPanel 不更新?

為什麼在益智遊戲中添加或移動圖像後我的 JPanel 不更新?

Patricia Arquette
發布: 2024-11-28 18:36:11
原創
595 人瀏覽過

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

益智遊戲中的 JPanel 未更新

在簡單的益智遊戲中,代表圖塊的圖像隨機放置在網格上。每個影像都有“地點”和“數字”屬性,指示其當前和所需的位置。遊戲邏輯正確地交換“數字”匹配的圖像並更新其“位置”屬性。但是,將更新的圖像新增至 JPanel 不會更新顯示的網格。

為了解決此問題,我們將修改 addComponents() 方法以正確刷新 JPanel:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板