空き時間にJavaバージョンのMonopolyを構築していて、Swingのレイアウトなどを理解するのに問題があります。
ボード上の私のスペースのそれぞれは本質的にカスタムJButton
であり、私はそれらをフレームの端の周りに配置しようとしています(独占ボード自体のように)。レイアウトシステムがどのように機能するかについての有用な説明が見つからないようで、問題があります。
フレームの端にボタンを配置する方法の例を教えてください。別のレイアウトを使用する必要がありますか?
空き時間にJavaバージョンのMonopolyを構築していて、Swingのレイアウトなどを理解するのに問題があります。
ボード上の私のスペースのそれぞれは本質的にカスタムJButton
であり、私はそれらをフレームの端の周りに配置しようとしています(独占ボード自体のように)。レイアウトシステムがどのように機能するかについての有用な説明が見つからないようで、問題があります。
フレームの端にボタンを配置する方法の例を教えてください。別のレイアウトを使用する必要がありますか?
これは、で最適に機能するのに役立つようBorderLayout
です。JPanel
すべてのを含む4つのを作成することをお勧めしJButton
ます。
次に、、、、、およびにJPanels
を追加します。BorderLayout.North
South
East
West
それはおそらくボタンをレイアウトする最も簡単な方法のように思えます。
ここは、を使い始めるのに最適な場所BorderLayout
です。
私はあなたがこれをレイアウトし始めるのを助けるかもしれないいくつかのコードを一緒に投げました。 コンパイルされていません。
int boardWidth;
int boardHeight;
int boardSquareHeight;
int boardSqusreWidth;
JPanel north = new JPanel();
JPanel south = new JPanel();
Dimension northSouthD = new Dimension(boardWidth, boardSquareHeight);
north.setPreferedSize(northSouthD);
south.setPreferedSize(northSouthD);
JPanel east = new JPanel();
JPanel west = new JPanel();
Dimension eastWestD = new Dimension(boardSquareHeight, boardHeight - 2 * boardSquaareWidth);
east.setPreferedSize(easWestD);
west.setPreferedSize(easWestD);
// add all of the buttons to the appropriate JPanel
parentPanel.setLayoutManager(new BorderLayout());
parentPanel.add(north, BorderLayour.NORTH);
...
これはすでに回答済みですが、GridLayoutがどのように機能するかを確認する価値があると感じました。まず、http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.htmlとhttp://www.cs.ubc.ca/local/computing/software/jdk-1.5.0/をオフにします。 docs / api / java / awt / GridBagConstraints.htmlは、長くて不可解な方法の署名を解読するのに役立ちます。
この独占ボードの例には、3つの主要な部分があります。レイアウトのセットアップ、JPanelsとしての大きなミドルピースの追加、およびJPanelsとしての外側の正方形の追加があります。
public class GridBagLayoutExample extends JFrame {
public static void main(String[] args) {
new GridBagLayoutExample().setVisible(true);
}
public GridBagLayoutExample() {
try {
//Setup the Layout
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
GridBagLayout thisLayout = new GridBagLayout();
thisLayout.rowWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
thisLayout.columnWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
getContentPane().setLayout(thisLayout);
//Default Grid values
int gridX = 0;
int gridY = 0;
//Add Panels for Each of the four sides
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 13; i++) {
JPanel tempPanel = new JPanel();
switch(j)
{
case 0://Top Spaces
gridX = i;
gridY = 0;
break;
case 1://Left Spaces
gridX = 0;
gridY = i;
break;
case 2://Right Spaces
gridX = 12;
gridY = i;
break;
case 3://Bottom Spaces
gridX = i;
gridY = 12;
break;
}
getContentPane().add(tempPanel,
new GridBagConstraints(gridX,// XGridSpot
gridY,// YGridSpot
1,// XGridSpaces
1,// YGridSpaces
0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH,//Fill
new Insets(0, 0, 0, 0), 0, 0));
tempPanel.setBorder(BorderFactory
.createLineBorder(Color.BLACK));
}
}
{// Main Inner Area Notice Starts at (1,1) and takes up 11x11
JPanel innerPanel = new JPanel();
getContentPane().add(
innerPanel,
new GridBagConstraints(1,
1,
11,
11,
0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
pack();
setSize(260, 260);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ここから、パネルを保持するための構造を追加すると、各パネルにボタンなどを追加できます。パネルの代わりにボタンも機能します。これは正しいインポートでコンパイルされるはずなので、コンパイルして試してみてください。
GridLayout
「内部」セルを空のままにすると、標準でうまくいく可能性があります。
おそらく、NetBeansのようなものでレイアウトを設計し、自動生成されたコード(作成した設計から間隔を生成します)を使用して独自のボードをレイアウトし、自動生成されたコードをコピーして、カスタムボタンに置き換えることができます。プレースホルダーとして使用した要素。
それはあなたがスイングにそれを理解させようとするのではなく、相対的な間隔に基づいてあなたが望む場所に物を正確に配置することを可能にするでしょう。