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(); }
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(); } } }); } }
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!