すみません、まだわかりません。これは質問の続きであり、答えを試みるものではありません。
私は GridBagLayout を理解できませんでした。私にとっては、説明されていないコンポーネントの素晴らしい例です。その制約などの多くの説明を見たことがありません。単なる例です。しかし、私がやりたいことは決して例のようには見えません。私は試行錯誤でそれをいじるのが嫌いで、自分が望むことを行う組み合わせで起こることを望んでいます. なんというプログラミングの仕方。
編集:わかりました、少なくとも継続の質問に対する答えです。典型的な試行錯誤を通じて、私は欠けている原則を発見したと信じており、誰かが公式文書を調べている間に失われることができるように、ここにそれを提供します.
Oracle の「GridBagLayout の使用方法」には、次の内容が含まれています。
この意味を見逃しがちです: gridbag は、その列/行のすべてのコンポーネントの優先サイズを使用して、列の幅と行の高さを決定します。GBL は、実現時に、列に表示されるすべてのコンポーネントを調べて、優先サイズの最大幅を決定し、それを最初の列の幅にするなどと考えてください。
以下のコードは、GridBagLayout パネルを、パネル内のコンポーネントの「x」、「y」、「幅」、および「高さ」属性によって決定される列と行を持つグリッドとして処理しようとしますが、GBL は明らかにそれを無視します。
そのため、以下の私のプログラムは期待どおりに動作しません。コンポーネントの適切なサイズの設定をいじることができ、プログラムがそれを行うべきではないと主張する人々の怒りを引き起こしました。この問題を解決する必要があるとしたら、実際にはそうしません。
OPに決定的なものを提案することはできません。この演習の後でも、コンポーネントのレイアウトには GroupLayout を (いくつか独自に追加したものを使用して) 使用しています。元の問題を解決する良い方法を選択するには、コンポーネントのサイズがどのように選択されているか、および OP に必要な柔軟性について詳しく知る必要があります。
これが私が持っているものです。
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
/**
* trying to do this:
* <pre>
* +----------------+----------------+--------+
* | | | |
* | tile 1 | tile 3 | |
* | | | |
* +----------------+----------------+ tile 5 |
* | | | |
* | | | |
* | | | |
* | tile 2 +----------------+--------+-------+
* | | | |
* | | tile 4 | tile 6 |
* | | | |
* |----------------+----------------+----------------+
*
* </pre>
*/
public class Tiles extends JFrame
{
private static final long serialVersionUID = 1L;
private GridBagConstraints constraints = new GridBagConstraints();
private Border lineBorder = BorderFactory.createLineBorder(Color.black);
JPanel gblPanel = new JPanel(new GridBagLayout());
public static void main(String[] args)
{
Tiles tiles = new Tiles();
tiles.go();
}
public void go()
{
createUI();
setVisible(true);
}
private void createUI()
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addLabelToGblPanel("1", 2, 1, 0, 0); // label, width, height, x position, y position
addLabelToGblPanel("3", 2, 1, 2, 0);
addLabelToGblPanel("5", 1, 2, 4, 0);
addLabelToGblPanel("2", 2, 2, 0, 1);
addLabelToGblPanel("4", 2, 1, 2, 2);
addLabelToGblPanel("6", 2, 1, 4, 2);
getContentPane().add(gblPanel);
pack();
}
private void addLabelToGblPanel(String num, int width, int height, int x, int y)
{
String numString = "Tile " + num;
JLabel tile = new JLabel(numString, SwingConstants.CENTER);
tile.setBorder(lineBorder);
constraints.ipadx = 25;
constraints.ipady = 25;
constraints.gridwidth = width;
constraints.gridheight = height;
constraints.gridx = x;
constraints.gridy = y;
// constraints.fill = GridBagConstraints.BOTH;
// constraints.weightx = 0.5;
// constraints.weighty = 0.5;
gblPanel.add(tile, constraints);
}
}
明らかに、私は何か間違っています。私が持っているものは、3x2 グリッドとして表示されます。私が付けたサイズと位置は、まったく違いはありません。これを行うために制約がどのように機能するかを説明できる人はいますか?
これが、手動で GroupLayout を実行する方法を学ばせた理由です...