在jpanel中更新按钮数组

时间:2014-04-18 14:57:48

标签: java arrays swing user-interface updatepanel

我发送一个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 个答案:

答案 0 :(得分:1)

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

  1. 只有在创建所有组件并将其添加到面板后,才需要执行revalidate()和repaint()。所以这两个陈述应该在for循环外面

  2. 不要在paintComponent()方法中调用revalidate()。这可能会导致无限循环,因为很多时候revalidate()会再次调用repaint()。我认为没有理由重写paintComponent()方法。

  3. 使用Java命名约定。类名以大写字符开头。但不要打电话给你的班级&#34; Panel&#34;因为已有名称的AWT类。

  4. 如果您需要更多帮助,请发布展示问题的正确SSCCE

    编辑:

    实际上我看到你正在创建一个全新的面板,因此在这个类中不需要revalidate(),repaint()逻辑。

    创建&#34;面板&#34;您必须将面板添加到框架,然后重新验证框架。否则你所做的就是创建一个位于内存中无所事事的面板。因此,创建此面板的代码负责将面板添加到框架。由于您没有发布该代码,我无法告诉您正在做什么。