>Java >java지도 시간 >내 스윙 퍼즐 게임에서 JPanel이 업데이트되지 않는 이유는 무엇이며 `revalidate()`를 사용하여 어떻게 해결할 수 있습니까?

내 스윙 퍼즐 게임에서 JPanel이 업데이트되지 않는 이유는 무엇이며 `revalidate()`를 사용하여 어떻게 해결할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-28 05:42:13733검색

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

퍼즐 게임의 JPanel이 업데이트되지 않음

이 퍼즐 게임에서 업데이트된 이미지를 추가한 후 JPanel이 업데이트되지 않는 문제는 addComponents()를 잘못 사용했습니다. 제공된 솔루션에서는 JPanel을 수동으로 다시 그리기 위해 PaintComponent()를 재정의할 것을 제안했지만 더 효율적인 접근 방식은 revalidate() 메서드를 사용하는 것입니다.

업데이트된 addComponents() 메서드:

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

revalidate()를 호출하면 JPanel은 레이아웃이 변경되었음을 알리고 그에 따라 디스플레이를 자동으로 업데이트합니다. 이렇게 하면 수동으로 다시 칠할 필요가 없습니다.

인증된 코드:

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;
    }
}

이러한 수정을 통해 퍼즐 게임은 이제 새 이미지가 추가될 때 JPanel을 올바르게 업데이트해야 합니다. .

위 내용은 내 스윙 퍼즐 게임에서 JPanel이 업데이트되지 않는 이유는 무엇이며 `revalidate()`를 사용하여 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.