JPanel im Puzzlespiel wird nicht aktualisiert
Das in diesem Puzzlespiel aufgetretene Problem, bei dem das JPanel nach dem Hinzufügen aktualisierter Bilder nicht aktualisiert wird, stammt von einem falsche Verwendung von addComponents(). Während die bereitgestellte Lösung vorschlug, paintComponent() zu überschreiben, um das JPanel manuell neu zu zeichnen, ist die Verwendung der revalidate()-Methode ein effizienterer Ansatz.
Aktualisierte addComponents()-Methode:
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]); } this.revalidate(); }
Durch den Aufruf von revalidate() wird das JPanel darüber informiert, dass sich sein Layout geändert hat, und aktualisiert seine Anzeige automatisch entsprechend. Dadurch entfällt die Notwendigkeit eines manuellen Neuzeichnens.
Verifizierter Code:
import javax.swing.*; import java.util.Random; import java.awt.event.*; import java.awt.*; class Puzzle extends JPanel implements ActionListener { private int selected_nr=-1; private int selected_pl=-1; private boolean memory=false; private static Img[] images; public Puzzle(){ JFrame f = new JFrame("Smile"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.setSize(252,252); f.setVisible(true); setLayout(new GridLayout(4, 4)); images = new Img[16]; int[] buttons = new int[16]; for(int i=0; i<16; i++){ buttons[i] = i; } int rand; int temp; Random random; random = new Random(System.currentTimeMillis()); for (int i = 0; i < buttons.length; i++) { rand = (random.nextInt() & 0x7FFFFFFF) % buttons.length; temp = buttons[i]; buttons[i] = buttons[rand]; buttons[rand] = temp; } for (int i = 0; i < 16; i++) { images[i] = new Img(i, buttons[i]); } addComponents(images); } 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]); } this.revalidate(); } public void actionPerformed(ActionEvent e) { Img b = (Img)(e.getSource()); int num = b.getNumber(); int pl = b.getPlace(); if(!(b.rightPlace())){ if(memory){ if(pl == selected_nr){ images[pl].setPlace(selected_pl); images[selected_pl].setPlace(selected_nr); selected_nr = -1; selected_pl = -1; memory = false; addComponents(images); } else{ System.out.println("Try other image"); } } else{ memory = true; selected_nr = num; selected_pl = pl; } } else{ System.out.println("OK !"); } } public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new Puzzle(); } }); } } class Img extends JButton { int number; int place; ImageIcon img; public Img(int p, int n){ number = n; place = p; img = new ImageIcon("u"+number+".jpg", BorderLayout.CENTER); setIcon(img); } public boolean rightPlace(){ boolean correct=false; if(number == place){ correct = true; } return correct; } public void setPlace(int i){ place = i; } public int getNumber(){ return number; } public int getPlace(){ return place; } }
Mit diesen Änderungen sollte das Puzzlespiel das JPanel nun korrekt aktualisieren, wenn neue Bilder hinzugefügt werden .
Das obige ist der detaillierte Inhalt vonWarum wird mein JPanel in meinem Swing-Puzzle-Spiel nicht aktualisiert und wie kann ich das Problem mit „revalidate()' beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!