Heim > Java > javaLernprogramm > Warum wird mein JPanel nicht aktualisiert, nachdem ich Bilder in einem Puzzlespiel hinzugefügt oder verschoben habe?

Warum wird mein JPanel nicht aktualisiert, nachdem ich Bilder in einem Puzzlespiel hinzugefügt oder verschoben habe?

Patricia Arquette
Freigeben: 2024-11-28 18:36:11
Original
512 Leute haben es durchsucht

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

JPanel im Puzzlespiel wird nicht aktualisiert

In einem einfachen Puzzlespiel werden Bilder, die Kacheln darstellen, zufällig auf einem Raster platziert. Jedes Bild verfügt über die Attribute „Ort“ und „Nummer“, die seine aktuelle und gewünschte Position angeben. Die Spiellogik tauscht Bilder, die hinsichtlich der „Anzahl“ übereinstimmen, korrekt aus und aktualisiert ihre „Ort“-Attribute. Durch das Hinzufügen der aktualisierten Bilder zum JPanel wird jedoch nicht das angezeigte Raster aktualisiert.

Um dieses Problem zu beheben, ändern wir die Methode addComponents(), um das JPanel ordnungsgemäß zu aktualisieren:

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();
}
Nach dem Login kopieren

Durch den Aufruf von revalidate() und repaint() zwingen wir das JPanel, sein Layout neu zu berechnen und die Anzeige mit dem neuen zu aktualisieren Bilder.

Alternativ können Sie sich das folgende Codebeispiel ansehen, das einen effizienteren Ansatz verwendet:

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();
                }
            }
        });
    }
}
Nach dem Login kopieren

Dieser Code erstellt segmentierte Bildschaltflächen und speichert sie in einem 4x4-Raster. Ein Timer regt das Mischen der Bilder an, indem er den Knopf oben rechts in die erste Position bewegt. Die Methoden revalidate() und repaint() stellen sicher, dass die Benutzeroberfläche nach jeder Tastenbewegung korrekt aktualisiert wird.

Das obige ist der detaillierte Inhalt vonWarum wird mein JPanel nicht aktualisiert, nachdem ich Bilder in einem Puzzlespiel hinzugefügt oder verschoben habe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage