2016-10-27 2 views
0

GridBagLayoutを使用して、グリッドレイアウトを持つJPanelと大きいボタンだけのJPanelを含むJFrameを作成しようとしています。私は行をすべて同じサイズにし、JButtonを持つJPanelを1行と同じサイズにします。ただし、現在空のボタンパネルはJFrameの約1/3です。私は何が起こっているのかはよく分かりませんが、私のコードの残りの部分がこれを使用しているので、私はこの構造を維持していることが私には非常に重要です。どんな助力もありがとうございます。事前に感謝します。GridBagLayoutを使用した不適切なサイジング

これは私のコードです:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class Minesweeper extends JPanel { 
     private final int SIZE = 7; 

     public void startGame(){ 
       JFrame holder = new JFrame(); 
       JPanel window = new JPanel(); 
       JPanel pan = new JPanel(); 
       holder.setLayout(new GridBagLayout()); 
       GridBagConstraints con = new GridBagConstraints(); 
       con.weightx = 1; 
       con.weighty = 1; 
       con.gridx = 0; 
       con.gridy = 0; 
       con.fill = GridBagConstraints.BOTH; 
       con.gridheight = SIZE; 
       con.gridwidth = SIZE; 
       holder.getContentPane().setBackground(Color.darkGray); 
       holder.setSize(450, 450); 
       holder.setResizable(false); 
       holder.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       window.setBackground(Color.darkGray); 
       window.setLayout(new GridLayout(SIZE, SIZE)); 
       for (int c=0; c<(SIZE*SIZE); c++){ 
         int row = (c/SIZE); 
         int col = (c%SIZE); 
         JPanel p = new JPanel(); 
         p.setBackground(Color.gray); 
         Border b = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); 
         p.setBorder(b); 
         window.add(p); 
       } 
       holder.add(window, con); 
       con.gridx = 0; 
       con.gridy = SIZE+1; 
       con.gridheight = 0; 
       con.gridwidth = SIZE; 
       holder.add(pan, con); 
       holder.setVisible(true); 
     } 

     public static void main(String[] args){ 
       Minesweeper start = new Minesweeper(); 
       start.startGame(); 
     } 
} 

これは何を示しているです:あなたは8のgridy値を指定することはできません

https://i.stack.imgur.com/HvguY.png

+0

'JPanel p = new JPanel();'自分自身(そしてユーザー)に好意を与えます。 'JButton p = new JButton();'にします。 'ActionListener'をボタンに追加すると、マウスのクリックとキーボード操作の両方に反応します。ボタンはアイコンやテキストもサポートしています(空白のタイル、クリアされたタイル、鉱山、周囲の鉱山の数などに便利です)。 –

+0

実際にjpanelsを使用するパネルクラスを作成しました。目標は掃海砲のゲームなので、もう少し操作できるようにする必要があります。 – acn3

+0

*「私はもう少し操作できるようにする必要があります」*具体的にはどうですか?私は、パネルができることは何か、ボタンはできないことは疑う。 –

答えて

1
con.gridy = SIZE+1; 

2つだけがあります。グリッドに追加されたコンポーネントグリッドでは、パネルの1つに7行のコンポーネントが含まれていることはわかりません。値は1にする必要があります。

これで問題は解決しませんが、GridBagLayoutの仕組みの誤解が解消されます。

holder.setSize(450, 450); 

手動でフレームにサイズを設定しています。各コンポーネントのサイズは、元のサイズになります。フレームに余分なスペースがある場合、スペースは2つのコンポーネント間で均等に分散されます。

サイズを設定しないでください。各コンポーネントは独自のサイズを決定し、pack()を使用する必要があります。そのため、pack()がその作業を行うことができるように、各コンポーネントの適切なサイズを返すためにgetPreferredSize()メソッドをオーバーライドするカスタムコンポーネントを使用する必要があります。

また、pack()は、setVisible()の直前に行われます。

+0

getPreferredSize()のことで、各JPanelをgetPreferredSize()というメソッドを持つクラスPanelのオブジェクトにするだけでいいですか? – acn3

関連する問題