2016-07-03 3 views
0

제목에 쓰여 있듯이이 JPanel에는 다른 요소 위에있는 모든 요소를 ​​보여주는 GridLayout이 있습니다. 저는 모든 CityPanel이 160x185 픽셀이고 주 JPanel (컨테이너)이 960x556 패널이라는 것을 확인하고 발견했습니다. 실수 란 무엇입니까?GridLayout은 첫 번째 셀의 모든 것을 보여줍니다.

public class MapPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 

    private CityPanel[][] cityPanels; 

    public MapPanel() { 
     super(); 
     ... 
     createLayout(); 

    } 

    @Override 
    public void paintComponent(Graphics g) { 


     super.paintComponent(g); 

     this.setSize(super.getWidth(), super.getHeight()); 
     mapGrid.setSize(super.getWidth(), super.getHeight()); 

     for(int i = 0; i < cityPanels.length; i++) { 
      for(int j = 0; j < cityPanels[i].length; j++) { 
       cityPanels[i][j].paintComponent(g); 
      } 
     } 

    } 



    private void createLayout() { 

     int columns = 6; 
     int rows = 6; 

     GridLayout layout = new GridLayout(rows, columns); 
     this.setLayout(layout); 

     cityPanels = new CityPanel[rows][columns]; //CityPanel extends JPanel 
     for (int r = 0; r < rows; r++) { 
      for (int c = 0; c < columns; c++) { 
       cityPanels[r][c] = new CityPanel(); 
       add(cityPanels[r][c]); 
      } 
     } 

     for (City city : cities) { 
      cityPanels[mapGrid.getRow(city) - 1][mapGrid.getColumn(city) - 1].initialize(city, mapGrid); 
     } 

    } 

} 
+0

더 나은 도움을 받으려면 [MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 게시하십시오. 이 코드는 관련성이 있다고 생각되는 무작위 비트가 아닙니다. 그것은 또한 '모든 코드'가 아닙니다. MCVE/SSCCE를 준비하기 전에 링크 된 문서를주의 깊게 읽으십시오. –

답변

0

하위 구성 요소에 paintComponent을 반복적으로 호출하지 마십시오. Swing의 paint() 메소드 (repaint()에 의해 트리거 됨)는 자동으로 자식 paintComponent 메소드를 호출합니다. MapPanel의 paint 메소드에 전달 된 Graphics 객체는 MapPanel의 크기와 위치로 생성됩니다. 따라서 MapPanel의 자식에 cityPanels[i][j].paintComponent(g)을 전달하면 자식 CityPanel이 부모 위치에서 자체 렌더링됩니다. CityPanel의 paintComponent 메소드가 정확하다고 가정하면 MapPanel paintComponent이 있어야합니다.

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
} 

은 창 크기를 조정하지 않는 경우
this.setSize(super.getWidth(), super.getHeight()); 
mapGrid.setSize(super.getWidth(), super.getHeight()); 

createLayout()에 포함되어야한다 또는 ComponentListener에서 사용자는 윈도우의 크기를 변경할 수있는 경우, 렌더 스레드를 늦추지 않도록합니다.

+0

'@Override public void paintComponent (Graphics g) { super.paintComponent (g); }'처음에는 메소드를 덮어 쓰지 않은 *** ***과 똑같은 효과가 있습니다! 따라서 실제 사용자 정의 그림은 필요하지 않으므로 완전히 제거해야합니다. –

관련 문제