如何解决当我切换组件的位置时 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 举报,一经查实,本站将立刻删除。