如何使用 GridBagLayout 设置 JButton 大小
How to set JButton size with GridBagLayout
我想将位于屏幕中央的 JButton 的大小设置得更大,但我似乎无法找到如何使用 GridBagLayout 来做到这一点。
这是它的样子:
这是我的代码:
// Client
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.CENTER;
c.gridy = 5;
c.gridx = 5;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 1, 1, 10);
p.add(b[0], c);
// Server
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.CENTER;
c.gridy = 10;
c.gridx = 5;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 1, 1, 10);
p.add(b[1], c);
我希望按钮占据周围空白 space 的较大部分。
我无法想象你想要什么,但如果你想让你的按钮填充周围,你可以添加
c.weightx = ...; //Specifies how to distribute extra horizontal space.
or c.weighty = ...; //Specifies how to distribute extra vertical space.
添加了更多信息:按钮具有父级宽度的 50% 和 [大约] 20% 的高度 [总计 50% 高度,包括中间的 space。 (稍微重写以符合建议。)
解决方案
简单布局布局的组合。虽然如果你这样做,你将有 3 列或 3 行无法连接,其余的稍后可以轻松更改:
// row variation
JPanel parent = new JPanel();
parent.setLayout(new GridLayout(3, 1));
parent.add(new JPanel()); // placeholder for 1st row
JPanel row = new JPanel(); // 2nd row
row.setLayout(new GridLayout(1, 3)); // create 3 cells of equal size
row.add(new JPanel()); // 2nd row, 1st cell placeholder
// now you have a 33% x 33% (oops) rectangle in the middle
JPanel controls = new JPanel();
controls.setLayout(new GridLayout(2, 1, 10, 10));
controls.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10);
controls.add(new JButton("Client"));
controls.add(new JButton("Server"));
row.add(controls); // add 2nd row, 2nd cell
row.add(new JPanel()); // 2nd row, 3rd cell placeholder
parent.add(row); // add 2nd row
parent.add(new JPanel()); // placeholder for 3rd row
简单,但您稍后将无法加入单元格:
JPanel parent = new JPanel();
parent.setLayout(newGridLayout(9, 9));
底线:结合不同的布局管理器,将您的 2 个按钮放在一个面板中并在其中放置一些占位符,然后它也应该可以与 GridBagLayout 一起正常工作。 也就是说,我会尝试通过编写 可重用组件 来保持灵活性,这些组件可以轻松地与任何布局管理器结合使用。这样您就不必为了正确显示组件而使用占位符多余的代码。
旧答案
备选方案:使用 BoxLayout
BoxLayout在看代码的时候更加直观易懂(当然这只是个人意见)
确定您的 window 的结构(它更像是彼此重叠的大水平组件 PAGE_AXIS
还是彼此相邻的大垂直组件 LINE_AXIS
) 并将其用作外部 BoxLayout:
JPanel content = new JPanel(); // or frame
content.setLayout(new BoxLayout(content, BoxLayout.LINE_AXIS));
沿轴添加组件,如果沿另一轴有多个组件,请使用第二个 BoxLayout。您可以 space 通过创建刚性区域(空矩形始终具有相同大小)或添加胶水(像口香糖一样与组件一起膨胀)来组件。
content.add(BoxLayout.createHorizntalGlue());
JPanel col = new JPanel();
col.setLayout(new BoxLayout(col, BoxLayout.PAGE_AXIS));
JButton clientBtn = new JButton("Client");
JButton serverBtn = new JButton("Server");
col.add(BoxLayout.createVerticalGlue());
col.add(clientBtn);
col.add(BoxLayout.createRigidArea(new Dimension(1, 10)));
col.add(serverBtn);
col.add(BoxLayout.createVerticalGlue());
content.add(col);
content.add(BoxLayout.createHorizontalGlue());
button.setMargin( new Insets(50, 50, 50, 50) );
这将向按钮添加额外的 space 并允许布局管理器根据按钮的首选大小完成他们的工作。
我想将位于屏幕中央的 JButton 的大小设置得更大,但我似乎无法找到如何使用 GridBagLayout 来做到这一点。
这是它的样子:
这是我的代码:
// Client
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.CENTER;
c.gridy = 5;
c.gridx = 5;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 1, 1, 10);
p.add(b[0], c);
// Server
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.CENTER;
c.gridy = 10;
c.gridx = 5;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 1, 1, 10);
p.add(b[1], c);
我希望按钮占据周围空白 space 的较大部分。
我无法想象你想要什么,但如果你想让你的按钮填充周围,你可以添加
c.weightx = ...; //Specifies how to distribute extra horizontal space.
or c.weighty = ...; //Specifies how to distribute extra vertical space.
添加了更多信息:按钮具有父级宽度的 50% 和 [大约] 20% 的高度 [总计 50% 高度,包括中间的 space。 (稍微重写以符合建议。)
解决方案
简单布局布局的组合。虽然如果你这样做,你将有 3 列或 3 行无法连接,其余的稍后可以轻松更改:
// row variation
JPanel parent = new JPanel();
parent.setLayout(new GridLayout(3, 1));
parent.add(new JPanel()); // placeholder for 1st row
JPanel row = new JPanel(); // 2nd row
row.setLayout(new GridLayout(1, 3)); // create 3 cells of equal size
row.add(new JPanel()); // 2nd row, 1st cell placeholder
// now you have a 33% x 33% (oops) rectangle in the middle
JPanel controls = new JPanel();
controls.setLayout(new GridLayout(2, 1, 10, 10));
controls.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10);
controls.add(new JButton("Client"));
controls.add(new JButton("Server"));
row.add(controls); // add 2nd row, 2nd cell
row.add(new JPanel()); // 2nd row, 3rd cell placeholder
parent.add(row); // add 2nd row
parent.add(new JPanel()); // placeholder for 3rd row
简单,但您稍后将无法加入单元格:
JPanel parent = new JPanel(); parent.setLayout(newGridLayout(9, 9));
底线:结合不同的布局管理器,将您的 2 个按钮放在一个面板中并在其中放置一些占位符,然后它也应该可以与 GridBagLayout 一起正常工作。 也就是说,我会尝试通过编写 可重用组件 来保持灵活性,这些组件可以轻松地与任何布局管理器结合使用。这样您就不必为了正确显示组件而使用占位符多余的代码。
旧答案
备选方案:使用 BoxLayout
BoxLayout在看代码的时候更加直观易懂(当然这只是个人意见)
确定您的 window 的结构(它更像是彼此重叠的大水平组件
PAGE_AXIS
还是彼此相邻的大垂直组件LINE_AXIS
) 并将其用作外部 BoxLayout:JPanel content = new JPanel(); // or frame content.setLayout(new BoxLayout(content, BoxLayout.LINE_AXIS));
沿轴添加组件,如果沿另一轴有多个组件,请使用第二个 BoxLayout。您可以 space 通过创建刚性区域(空矩形始终具有相同大小)或添加胶水(像口香糖一样与组件一起膨胀)来组件。
content.add(BoxLayout.createHorizntalGlue()); JPanel col = new JPanel(); col.setLayout(new BoxLayout(col, BoxLayout.PAGE_AXIS)); JButton clientBtn = new JButton("Client"); JButton serverBtn = new JButton("Server"); col.add(BoxLayout.createVerticalGlue()); col.add(clientBtn); col.add(BoxLayout.createRigidArea(new Dimension(1, 10))); col.add(serverBtn); col.add(BoxLayout.createVerticalGlue()); content.add(col); content.add(BoxLayout.createHorizontalGlue());
button.setMargin( new Insets(50, 50, 50, 50) );
这将向按钮添加额外的 space 并允许布局管理器根据按钮的首选大小完成他们的工作。