JPanel dalam Permainan Teka-teki Tidak Kemas Kini
Isu yang dihadapi dalam permainan teka-teki ini di mana JPanel tidak mengemas kini selepas menambah imej yang dikemas kini berpunca daripada penggunaan addComponents() yang salah. Walaupun penyelesaian yang disediakan mencadangkan mengatasi paintComponent() untuk melukis semula JPanel secara manual, pendekatan yang lebih cekap ialah menggunakan kaedah revalidate().
Kaedah addComponent() yang dikemas kini:
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(); }
Dengan memanggil revalidate(), JPanel akan dimaklumkan bahawa reka letaknya telah berubah dan akan mengemas kini paparannya secara automatik sewajarnya. Ini menghapuskan keperluan untuk mengecat semula secara manual.
Kod Disahkan:
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; } }
Dengan pengubahsuaian ini, permainan teka-teki kini seharusnya mengemas kini JPanel dengan betul apabila imej baharu ditambahkan .
Atas ialah kandungan terperinci Mengapa JPanel Saya Tidak Kemas Kini dalam Permainan Teka-teki Swing Saya dan Bagaimana Saya Boleh Membetulkannya Menggunakan `revalidate()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!