だから、私はこれを考え出しました。 (!それが起こるかおかしい)
は、私がリンクされ、関連する質問に基づいて、私はBorderLayoutのを使用してみました:
public class SwingTest {
public static void main(String[] args) {
JFrame mainWindow = new JFrame("Swing Test");
mainWindow.setLayout(new BorderLayout());
mainWindow.add(new JLabel("Heading"));
mainWindow.add(new JButton("Button"));
JPanel bigPanel = new JPanel();
bigPanel.setLayout(new GridLayout(10, 10));
for (int i = 0; i < 100; i++) {
bigPanel.add(new JCheckBox("Item " + i));
}
mainWindow.add(new JScrollPane(bigPanel));
mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainWindow.setLocationByPlatform(true);
mainWindow.pack();
mainWindow.setVisible(true);
}
}
しかし、それは動作しませんでした、私はBorderLayoutのが何をするかの根本的な誤解があったと思うので、 。 add(...)の呼び出しに制約を指定しないことで、3つのコンポーネントすべてを "CENTER"ペインに追加していました。 BorderLayoutの目的は、コンテナのサイズに合わせて1つのコンポーネントを格納することです。固定サイズのままであるエッジの周りに他のものを配置することができます(罫線)。 CENTERに3つすべてを追加することで、最後に追加したものだけが残されました。私はJPanelの中で私の見出しとボタンをラップし、上端にそれを置くために必要な:
public class SwingTest {
public static void main(String[] args) {
JPanel top = new JPanel();
top.setLayout(new BoxLayout(top, BoxLayout.PAGE_AXIS));
top.add(new JLabel("Heading"));
top.add(new JButton("Button"));
JPanel bigPanel = new JPanel(new GridLayout(10, 10));
for (int i = 0; i < 100; i++) {
bigPanel.add(new JCheckBox("Item " + i));
}
JFrame mainWindow = new JFrame("Swing Test");
mainWindow.setLayout(new BorderLayout());
mainWindow.add(top, PAGE_START);
mainWindow.add(new JScrollPane(bigPanel), CENTER);
mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainWindow.setLocationByPlatform(true);
mainWindow.pack();
mainWindow.setVisible(true);
}
}
コンポーネントがその後正しく振る舞ったが、ウィンドウにはスクロールは、チェックボックスのグリッドを必要としなかったことを十分に大きく成長したとき、私が望んでいなかったスペースに合わせて拡張しました。私はちょうどそれが左上にピン止めしたいと思った。ここではそれを修正するものです。
public class SwingTest {
public static void main(String[] args) {
JPanel top = new JPanel();
top.setLayout(new BoxLayout(top, BoxLayout.PAGE_AXIS));
top.add(new JLabel("Heading"));
top.add(new JButton("Button"));
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = NONE;
JPanel bigPanel = new JPanel(new GridBagLayout());
for (int i = 0; i < 10; i++) {
gbc.gridx = RELATIVE;
gbc.gridy = i;
gbc.anchor = NORTHWEST;
for (int j = 0; j < 10; j++) {
bigPanel.add(new JCheckBox("Item " + (10 * i + j)), gbc);
}
}
// add a panel to the right side to prevent the grid from growing horizontally
gbc.fill = BOTH;
gbc.weightx = 1;
bigPanel.add(new JPanel(), gbc);
// add another panel to the bottom to prevent the grid from growing vertically
gbc.gridy = RELATIVE;
gbc.gridx = 0;
gbc.weightx = 0;
gbc.weighty = 1;
bigPanel.add(new JPanel(), gbc);
JFrame mainWindow = new JFrame("Swing Test");
mainWindow.setLayout(new BorderLayout());
mainWindow.add(top, PAGE_START);
mainWindow.add(new JScrollPane(bigPanel), CENTER);
mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainWindow.setLocationByPlatform(true);
mainWindow.pack();
mainWindow.setVisible(true);
}
}
なポイント:
- は常にのBorderLayoutの中心に自分自身でするJScrollPaneを置きます。
- サイズ変更時にグリッドライクなコンテンツの「セルパディング」を動的に拡大しないようにするには、GridLayoutではなくGridBagLayoutを使用します。
*「私はSSCCEを書いている間にこれを理解しました(面白いやり方!」)。面白いかもしれませんが、それもかなり一般的です。これは、短い例を作ることの(多くの)利点の1つです。それは、大きく見える複雑な問題をコアの問題にまで減らし、問題と解決策の両方を見やすくします。あなたがそれを整理してうれしいです。:) –
JFrameのコンテンツペインのデフォルトのレイアウトはBorderLayoutなので、 'mainWindow.setLayout(new BorderLayout());ステートメントの必要はありません; – FredK
@AndrewThompson"どうしたらいいのですか? "そのことを指摘することを意図していました。私は単に投稿しないことについて議論しましたが、それを理解するまでにはかなり時間がかかりましたので、私は働かせないようにして、私のSSCCEは無駄になりました。 :) – JakeRobb