2014-04-18 2 views
-1

생성자 패널에 int 배열을 보내면 처음으로 gui가 생성되지만 다음 배열에서는 패널/jframe을 업데이트하지 않습니다.jpanel에서 버튼 배열 업데이트

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

게시 된 코드를 기반으로 수행중인 작업을 알 수 없습니다. 그러나 몇 가지 일반적인 코멘트 :

  1. 만 재 검증을 할() 모든 구성 요소를 생성하고 패널에 추가 된 후에 번) (다시 칠해야합니다. 따라서이 두 문은 for 루프 바깥쪽에 있어야합니다.

  2. paintComponent() 메서드 내에서 revalidate()를 호출하지 마십시오. revalidate()가 repaint()를 다시 호출 할 때부터 무한 루프가 발생할 수 있습니다. 나는 paintComponent() 메소드를 전혀 오버라이드 할 아무런 이유가 없다.

  3. Java 명명 규칙을 사용하십시오. 클래스 이름은 대문자로 시작합니다. 그러나 이미 클래스의 AWT 클래스가 있으므로 클래스 "Panel"을 호출하지 마십시오.

추가 도움이 필요하면 문제를 나타내는 SSCCE을 게시하십시오.

편집 : 논리는이 클래스에서 필요하다()

은 실제로 당신이 완전히 새로운 패널을 만드는 것을 볼 수 있으므로 재 검증 중에(), 칠 없습니다.

"패널"을 만든 후에는 패널을 프레임에 추가 한 다음 프레임의 유효성을 다시 검사해야합니다. 그렇지 않으면 아무것도하지 않고 메모리에있는 패널을 만드는 것뿐입니다. 따라서이 패널을 만드는 코드는 패널을 프레임에 추가해야합니다. 당신이 그 코드를 게시하지 않았기 때문에 나는 당신이하는 일을 말할 수 없습니다.

+0

thx, 코드를 업데이트했지만 문제가 지속됩니다. "matriz"는 새로운 데이터를 가지고 있지만 jpanel은 전혀 변경이 없습니다 – user3547063

+1

@ user3547063, 편집을 참조하십시오. 적절한 'SSCCE'가 없으면 더 이상 도움을 줄 수 없습니다. – camickr