我发送一个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();
}
答案 0 :(得分:1)
无法根据发布的代码告诉您正在做什么。但是一些一般性评论:
只有在创建所有组件并将其添加到面板后,才需要执行revalidate()和repaint()。所以这两个陈述应该在for循环外面
不要在paintComponent()方法中调用revalidate()。这可能会导致无限循环,因为很多时候revalidate()会再次调用repaint()。我认为没有理由重写paintComponent()方法。
使用Java命名约定。类名以大写字符开头。但不要打电话给你的班级&#34; Panel&#34;因为已有名称的AWT类。
如果您需要更多帮助,请发布展示问题的正确SSCCE。
编辑:
实际上我看到你正在创建一个全新的面板,因此在这个类中不需要revalidate(),repaint()逻辑。
创建&#34;面板&#34;您必须将面板添加到框架,然后重新验证框架。否则你所做的就是创建一个位于内存中无所事事的面板。因此,创建此面板的代码负责将面板添加到框架。由于您没有发布该代码,我无法告诉您正在做什么。