2014-04-07 3 views
0

어떻게 다른 JPanel 내부에있는 JPanel을 다시 칠할 수 있습니까?다른 JPanel 내부의 JPanel 다시 그리기

내 주요 패널 :

contentPane = new JPanel() { 
     protected void paintComponent(java.awt.Graphics g) { 
      super.paintComponents(g); 
      try { 
       g.drawImage(ImageIO.read(JanelaJogo.class 
         .getResource("/imagens/fundo/fundo4.jpg")), 0, 0, 
         this); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

    }; 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

이 패널 내 코드 조각이있다 ... 나는 내가 인터넷에서 발견 된 몇 가지 답변을 시도했지만 나는 그것이 작동하지 수 내부 :

bonusPanel = new JPanel() { 
     @Override 
     public void paintComponents(Graphics g) { 
      // TODO Auto-generated method stub 
      super.paintComponent(g);     

     } 
     @Override 
     public Dimension getPreferredSize() 
     { 
      Dimension dim = contentPane.getSize(); 
      int largura = dim.width; 
      dim = new Dimension(largura, 150); 
      return new Dimension(dim); 
     } 

    }; 
bonusPanel.setBackground(new Color(0, 0, 0, 0)); 
contentPane.add(bonusPanel, BorderLayout.SOUTH); 

내 bonusPanel 이미지 아이콘이다 2 개 레이블이, 일부 사용자가 게임을 조합 할 때 그 이미지 새로 고침을 원하는, 문제는 내가 가지고 ... 그것은 상쾌한되지 않는 것입니다 시도했습니다 repaint(), revalidade(), validade(), contentPane, bonusPanel에는 아무런 작업이 없습니다 ... 도움을 위해 미리 감사드립니다!

업데이트 :이 이미지는 내가 더 나은 내가 원하는 것을 설명 할 것입니다 ... enter image description here

내가 "폭탄"의 일치가있을 때, 자바 콘솔, 프로그램의 출력에 넣어, 그래서 , 힘 (버튼에 폭탄) 이미지를 변경해야합니다 ... 그리고 당신이 볼 수 있듯이, "bonus_bomba_1.png"및 "bonus_bomba_2.png"이미지로 변경하지만 현재 이미지를 콘솔에 인쇄,하지만 문제는 GUI를 새로 고치고 있습니다 ... 이전에 게시 한 코드를 최신 버전으로 업데이트했습니다 ... 아직 수행해야 할 작업을 파악하지 못했기 때문에 drawImage를 변경하지 않았습니다. 아직 변경되지 않았습니다 ...

이것은 내가 업데이트 "전원"의 라벨의 이미지를하고 있어요 무엇 :

private void iconBomb(String s) { 

    try { 
     bombPic = ImageIO.read(this.getClass().getResource(s)); 
     powerBomb.setIcon(new ImageIcon(bombPic)); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

가 도움을 사전에 감사합니다!

답변

3

1) super.paintChildren()을 호출하지 마십시오. 스윙이 당신을 위해 그것을 할 것입니다. 당신이하는 일은 super.paintComponent();

2) 페인팅 방법으로 파일을 읽지 마십시오. 그림 그리기 방법은 그림 그리기 전용입니다.

3) 프레임의 남은 부분에 보너스 패널을 추가하므로 원하는 크기로 패널이 표시됩니다.

@Override 
public Dimension getPreferredSize() 
{ 
    return new Dimension(...); 
} 

이 더 많은 정보와 작업 예제 Custom Painting에 스윙 튜토리얼 섹션을 읽어보십시오 : 당신은 적당한 크기를 반환하기 위해 패널의 getPreferredSize() 메소드를 오버라이드 (override) 할 필요가있다.

+0

당신이 말했지만 아직 라벨의 이미지를 새로 고치지 않은 모든 작업이 완료되었습니다. –

+0

@ JoãoSilva, 질문을 업데이트하여 문제를 보여주는 적절한 [SSCCE] (http://www.sscce.org/)를 게시하십시오. 'SSCCE'는 모든 질문에 게시해야하므로 귀하가하는 일을 추측 할 필요가 없습니다. – camickr

+0

지금 내 질문이 업데이트되었습니다. 도움에 감사드립니다. –