2016-07-03 9 views
0

タイトルに書かれているように、私は他の要素の上にあるすべての要素を示すGridLayoutを持つJPanelを持っています。私はすべての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]または[短く、自己完結型の正しい例](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); 
} 

ユーザーがウィンドウのサイズを変更することができれば、あなたのウィンドウはComponentListenerにサイズを変更したりしていない場合、

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

createLayout()に含まれるべきです。

+0

'@Override public void paintComponent(Graphics g){ super.paintComponent(g); } 'は、最初の場所でメソッドをオーバーライドしていない***と全く同じ効果があります!実際のカスタムペインティングは必要ありませんので、完全に削除する必要があります。 –

関連する問題