2016-09-06 58 views
0

私はプロジェクトではJavaでCrossWordパズルをやっています。しかし、私はJPanelにCrossWordを描画する際に抱えている1つの問題を解決できませんでした。GridLayoutは次元に比例しません

プログラムは、2次元配列のcharからデータを取り出し、JLabelsのカスタムタイプのグリッドを生成します。しかし、これはないが、

public void update(Observable o, Object o1) { 
    if(model.getMatrix() != null){ 
     configurePanel(model.getRows(), model.getCols()); 
     this.add(panel); 
     this.pack(); 
     this.revalidate(); 
     this.repaint(); 
    } 

} 

private void configurePanel(int w, int h) { 
    if (panel!=null){ 
     this.remove(panel); 
    } 

    panel = new JPanel(); 

    panel.setBounds(40, 40, w*50, h*50); 
    panel.setLayout(new GridLayout(w, h)); 

    labels = createLabels(model.getMatrix()); 

    for (int i = 0; i < w; i++){ 
     for(int j = 0; j < h; j++){ 

      panel.add(labels[i][j]); 
     }   
    } 
} 

private CWlabel[][] createLabels(char[][] matrix) { 
    int w = matrix.length; 
    int h = matrix[0].length; 
    labels = new CWlabel[w][h]; 

    for (int i = 0; i < w; i++){ 
     for(int j = 0; j < h; j++){ 
      char c = matrix[i][j]; 
      labels[i][j] = new CWlabel(); 
      labels[i][j].setBorder(BorderFactory.createLineBorder(Color.black)); 
      labels[i][j].setOpaque(true); 
      if (c != ' '){ 
       labels[i][j].setBackground(Color.white); 
      } else { 
       labels[i][j].setBackground(Color.black); 
      } 
     } 
    } 
    return labels; 
} 

私の主な問題は、パネルの大きさは、それが完全に正方形である内部のすべてのコンポーネントを保証しなければならないクロスワードの寸法に比例して設定されているconfigurePanel()である:これは、コードであります差を示した場合の例でas seen here

は微妙まだnotizableあります。奇妙な部分はその

、私は手動で交換する場合
panel.setBounds(40, 40, w*50, h*50); 

で、

panel.setBounds(40, 40, 400, 450); 

結果はhere

+2

1) 'setBounds()'をしないでください! [レイアウトマネージャ](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)を使用する際のポイントは何ですか? 2)[mcve]を投稿してください。3)[GridLayout](https://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html)チュートリアルを読んでいますか? – Frakcool

+2

[getPreferredSize() '](http://stackoverflow.com/q/7229226/230513)をオーバーライドすることを実際に意味するときは、' setBounds() 'や' setPreferredSize() 'を使わないでください。 – trashgod

答えて

1
を示すように、行と列の量に比例すると表示されていること

私のカウントでは9の行と8の列があるので、configurePanelをfollのように呼びます:

configurePanel(model.getRows(), model.getCols()); 

450の幅と 400の高さになりそうですが、あなたは 400の幅と 450の高さが欲しいです。

configurePanel(model.getCols(), model.getRows()); 

注:これにより、以下のように、第1及び第2のパラメータの周りに切り替えるあなたは、絶対位置を使用してはならない、それが道を多くの書式の問題を(など、コンポーネントを追加して、コンポーネントのサイズを変更する)を引き起こします。代わりに、GridBagLayoutMigLayoutのようなカスタマイズのレイアウトマネージャを使用する必要があります。

+0

ありがとうございます、あなたが指摘したレイアウトマネージャーについてもっと調べてみましょう! –

関連する問題