Rumah > Java > javaTutorial > Mengapa JPanel Saya Tidak Kemas Kini dalam Permainan Teka-teki Swing Saya dan Bagaimana Saya Boleh Membetulkannya Menggunakan `revalidate()`?

Mengapa JPanel Saya Tidak Kemas Kini dalam Permainan Teka-teki Swing Saya dan Bagaimana Saya Boleh Membetulkannya Menggunakan `revalidate()`?

Patricia Arquette
Lepaskan: 2024-11-28 05:42:13
asal
704 orang telah melayarinya

Why Doesn't My JPanel Update in My Swing Puzzle Game, and How Can I Fix It Using `revalidate()`?

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();
}
Salin selepas log masuk

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() &amp; 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;
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan