当我切换组件的位置时 JFrame 不更新

问题描述

PS:这里是那些有兴趣的人的 GitHub https://github.com/Yasakidev/AnimalRescueUP/tree/master

我正在用 Swing 开发“Pet Rescue Saga”Java 游戏。我是 Swing 的新手,但遇到了问题。

我希望我的作品在被移除时掉落。在这里,我设法通过改变它们的颜色来“去除它们”,但随后我希望它们像俄罗斯方块一样落下。

这是我的代码

GRID(即 JFrame 和单例类)

import javax.swing.*;
import java.awt.*;

public class Grid extends JFrame {
    private static Grid main;
    private Case[][] cases;

    public Grid() {
        this.cases = new Case[8][8];
        for (int i = 0; i < cases.length; i++) {
            for (int j = 0; j < cases[i].length; j++) {
                this.cases[i][j] = new Case(i,j);
                this.add(cases[i][j]);
            }
        }
        this.setSize(800,800);
        this.setLayout(new GridLayout(8,8));
        this.setDefaultCloSEOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public Case getCase(int i,int j) {
        return this.cases[i][j];
    }

    public static Grid getGrid() {
        if(main == null) main = new Grid();
        return main;
    }

    public void swap(int x1,int y1,int x2,int y2) {
        Case temp = this.cases[x1][y1];
        cases[x1][y1] = cases[x2][y2];
        cases[x2][y2] = temp;
    }

    public void rebuild() {
        for(int i = cases.length-1-1; i > 0; i--) {
            for (int j = cases[i].length-1-1; j > 0; j--) {
                int k = i;
                while(!cases[k+1][j].isActive()) {
                    this.swap(i,j,i+1,j);
                    k++;
                }
            }
        }
        //swap(5,5,6);
    }
}

CASE(它定义了网格内的块,单击时,它们运行 clicked() 并递归删除所有相邻的相同颜色的块)

import utils.RandomGen;

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;

public class Case extends JPanel {
    private JButton btn;
    private Color color;
    private final int posX;
    private final int posY;

    private boolean isActive;

    public Case(int x,int y) {
        //Init Members
        this.posX = x;
        this.posY = y;

        //Init Components
        this.initColor();
        this.initButton();
        this.initPanel();
    }

    public void clicked() {
        this.setVisible(false);
        this.isActive = false;
        checkAdjacent();
        Grid.getGrid().rebuild;
    }

    private void initColor() {
        int i = RandomGen.get(0,4);
        switch(i) {
            case 0 -> this.color = new Color(255,0);
            case 1 -> this.color = new Color(0,255);
            case 2 -> this.color = new Color(136,255);
            case 3 -> this.color = new Color(27,255,0);
            default -> this.color = new Color(0,0);
        }
    }

    private void initButton() {
        this.btn = new JButton();
        this.btn.setopaque(false);
        this.btn.setContentAreaFilled(false);
        this.btn.setBorderPainted(false);
        this.btn.addActionListener(new ClickEventHandler(this));
    }

    private void initPanel() {
        this.setBorder(new LineBorder(new Color(0,0)));
        this.setBackground(this.color);
        this.add(btn);
        this.setLayout(new cardlayout());
        this.isActive = true;
        this.setVisible(true);
    }

    private void checkAdjacent() {
        //CLEAR DOWN
        if(this.posX != 7 && Grid.getGrid().getCase(this.posX+1,this.posY).isActive && Grid.getGrid().getCase(this.posX+1,this.posY).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX+1,this.posY).clicked();
        //CLEAR UP
        if(this.posX != 0 && Grid.getGrid().getCase(this.posX-1,this.posY).isActive && Grid.getGrid().getCase(this.posX-1,this.posY).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX-1,this.posY).clicked();
        //CLEAR RIGHT
        if(this.posY != 7 && Grid.getGrid().getCase(this.posX,this.posY+1).isActive && Grid.getGrid().getCase(this.posX,this.posY+1).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX,this.posY+1).clicked();
        //CLEAR LEFT
        if(this.posY != 0 && Grid.getGrid().getCase(this.posX,this.posY-1).isActive && Grid.getGrid().getCase(this.posX,this.posY-1).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX,this.posY-1).clicked();
    }

    public Color getColor() {
        return color;
    }

    public int getPosX() {
        return posX;
    }

    public int getPosY() {
        return posY;
    }

    public boolean isActive() {
        return isActive;
    }
}

这是问题的两张截图 Randomly generated grid

When clicking on the red pattern for example,i want the rest of the blocks to fall

我尝试使用 Grid.rebuild() 使块掉落,但显示内容没有任何变化。

另外,如果你发现坏习惯或错误,请把它们告诉我。

感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)