我创建了一个类,它以 2 个维度 ( n,m ) 和一个矩阵 ( mat ) 作为参数。这个类创建一个 JFrame,用白色(代表 1)或黑色(代表 0)的按钮填充它。
问题是,发送的矩阵不断变化,我希望按钮颜色更新。如果我在循环中设置 mainframe game = new mainframe(n,m,mat)
并更改矩阵,它会不断生成 JFrame 窗口。
我在这个网站上读到一些东西,使用 repaint() 或 revalidate() 可以做这样的事情。我尝试将其放入不同的代码段中,但没有成功。
主类只是一个循环,它调用“大型机”并在循环中更新矩阵。下面是使 GUI 实际工作的类:
package game;
import java.awt.Color;
public class mainframe extends Jframe {
public mainframe(int n,int m,int mat[][]){
JButton[] buttons = new JButton[n*m];
setSize(600,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setLayout(new GridLayout(n,m));
for(int i = 0; i<n*m;i++) {
buttons[i] = new JButton();
}
int counter = 0;
for(int j=0;j<n;j++){
for(int k=0;k<m;k++){
if(mat[j][k]==0){
buttons[counter].setBackground(Color.BLACK);
}
add(buttons[counter]);
counter++;
}
}
}
}
最佳答案
添加组件后放置 setVisible(true);
或 revalidate();
。与 frame content pane 更好地合作.
import javax.swing.*;
import java.awt.*;
class Scratch {
public static void main(String[] args) throws InterruptedException {
JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(600, 400);
jFrame.setVisible(true);
for (int i = 5; i < 10; ++i) {
jFrame.setContentPane(createPanel(i, i, new int[i][i]));
jFrame.revalidate();
Thread.sleep(1000);
}
}
public static JPanel createPanel(int n, int m, int[][] mat) {
JButton[] buttons = new JButton[n * m];
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(n, m));
for (int i = 0; i < n * m; i++) {
buttons[i] = new JButton();
}
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
int index = k + k * j;
if (mat[j][k] == 0) {
buttons[index].setBackground(Color.BLACK);
}
jPanel.add(buttons[index]);
}
}
return jPanel;
}
}
关于java - 如何不断更新按钮颜色 [JAVA SWING],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57663319/