私はプロジェクトでは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
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
[getPreferredSize() '](http://stackoverflow.com/q/7229226/230513)をオーバーライドすることを実際に意味するときは、' setBounds() 'や' setPreferredSize() 'を使わないでください。 – trashgod