更新jpanel中的按钮数组



我向构造函数面板发送了一个int数组,第一次创建gui,但下一个数组不会更新面板/jframe。

class panel extends JPanel{
    public panel(int matriz[][]) {
        this.setPreferredSize(new Dimension(300, 300));
        this.setLayout(new GridLayout(5, 5));
        this.revalidate();
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if(matriz[i][j]==1)
                {
                    JButton boton = new JButton("");   
                    boton.setBackground(Color.yellow);
                    this.add(boton);
                    boton.revalidate();
                    boton.repaint();
                }
                else
                {
                    JButton boton = new JButton("");   
                    this.add(boton);
                    boton.revalidate();
                    boton.repaint();
                }
                if(j==4) //imprimo pa ver si realmente me esta enviando datos desde creandoVida
                    System.out.println("n"+matriz[i][j]);
                else
                    System.out.print(matriz[i][j]);
            }
        }
        System.out.println("---");
        this.doLayout();
        this.revalidate();
        this.repaint();
    }
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    this.revalidate();
}

无法根据发布的代码判断您正在做什么。但一些一般性评论:

  1. 您只需要在创建所有组件并将其添加到面板后执行一次重新验证()和重新绘制()。所以这两个语句应该在for循环之外

  2. 不要从paintComponent()方法中调用revalidate()。这可能会导致一个无限循环,因为很多次重新验证()都会再次调用重新绘制()。我认为你根本没有理由重写paintComponent()方法。

  3. 使用Java命名约定。类名以大写字符开头。但不要将类称为"Panel",因为已经有一个同名的AWT类了。

如果您需要更多帮助,请张贴正确的SSCCE来说明问题。

编辑:

事实上,我看到您正在创建一个全新的面板,所以这个类中不需要重新验证()、重新绘制()逻辑。

创建"面板"后,必须将面板添加到框架中,然后重新验证框架。否则,你所要做的就是创建一个位于内存中的面板,什么都不做。因此,创建这个面板的代码负责将面板添加到框架中。由于你没有发布那个代码,我不知道你在做什么。

相关内容

  • 没有找到相关文章

最新更新