java - 如何不断更新按钮颜色 [JAVA SWING]

标签 java swing

我创建了一个类,它以 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/

相关文章:

Java 语法 : byte f()[] vs. byte[] f()

java - 将带有 JPanel 的 JToggleButton 放入 JTable 单元格中

java - component.get MouseMotionListener 返回多个

Java : need explanation about Graphics

java - 使用自定义 JOptionPane 按钮? int 延迟错误?

c# - Java 中 C# 用户定义转换的替代方案

java - 安卓资源文件

java - JMenuCheckBox : How to set an accelerator with only 1 key

java - 什么字符集将 "é"字符编码为十进制 130?

java - 强制完全重绘 Jpanel Java2D