Maison > Java > javaDidacticiel > Pourquoi mon JPanel ne se met-il pas à jour après avoir ajouté ou déplacé des images dans un jeu de réflexion ?

Pourquoi mon JPanel ne se met-il pas à jour après avoir ajouté ou déplacé des images dans un jeu de réflexion ?

Patricia Arquette
Libérer: 2024-11-28 18:36:11
original
511 Les gens l'ont consulté

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

JPanel dans le jeu de puzzle ne se met pas à jour

Dans un jeu de puzzle simple, des images représentant des tuiles sont placées au hasard sur une grille. Chaque image possède les attributs « lieu » et « numéro » indiquant sa position actuelle et souhaitée. La logique du jeu échange correctement les images qui correspondent en « nombre » et met à jour leurs attributs « lieu ». Cependant, l'ajout des images mises à jour au JPanel ne met pas à jour la grille affichée.

Pour résoudre ce problème, nous allons modifier la méthode addComponents() pour actualiser correctement le 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();
}
Copier après la connexion

En invoquant revalidate() et repaint(), nous forçons le JPanel à recalculer sa disposition et à mettre à jour l'affichage avec le nouveau images.

Vous pouvez également considérer l'exemple de code suivant, qui utilise une approche plus efficace :

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();
                }
            }
        });
    }
}
Copier après la connexion

Ce code crée des boutons d'image découpés et les stocke dans une grille 4x4. Une minuterie stimule le brassage des images en déplaçant le bouton en haut à droite vers la première position. Les méthodes revalidate() et repaint() garantissent que l'interface utilisateur se met à jour correctement après chaque mouvement de bouton.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal