在我简单的SwingApp中,我无法让gridwidth在GridBagLayout中工作。
我在Java Swing中有这样的代码:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
class GridBagLayt extends JFrame {
GridBagLayt()
{
JButton jb1 = new JButton("1");
JButton jb2 = new JButton("2");
JButton jb3 = new JButton("3");
JButton jb4 = new JButton("4");
JButton jb5 = new JButton("5");
GridBagLayout lay = new GridBagLayout();
GridBagConstraints cons = new GridBagConstraints();
setLayout(lay);
cons.fill = GridBagConstraints.BOTH;
cons.gridheight = 1;
cons.weightx = 1;
cons.weighty = 1;
cons.gridx = 0; cons.gridy = 0;
cons.gridwidth = 2;
lay.setConstraints(jb1, cons);
add(jb1);
cons.gridx = 2;
lay.setConstraints(jb2, cons);
add(jb2);
cons.gridx = 0; cons.gridy = 1;
cons.gridwidth = 1;
lay.setConstraints(jb3, cons);
add(jb3);
cons.gridx = 1;
cons.gridwidth = 2;
lay.setConstraints(jb4, cons);
add(jb4);
cons.gridx = 3;
cons.gridwidth = 1;
lay.setConstraints(jb5, cons);
add(jb5);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(700,200);
setVisible(true);
}
}
public class SwingApp {
public static void main(String[] args) {
new GridBagLayt();
}
}
这就是我想要的:
但我却得到了这个:
我真的不知道问题出在哪里,坐标和网格宽度对我来说似乎没问题,我希望这能起作用,但事实并非如此。如果我在这两行之间再添加四个按钮,那么第三行似乎可以,但我不希望这样:
示例:如果我添加此代码
cons.gridx = 0; cons.gridy = 0;
cons.gridwidth = 2;
lay.setConstraints(jb1, cons);
add(jb1);
cons.gridx = 2;
lay.setConstraints(jb2, cons);
add(jb2);
cons.gridx = 0; cons.gridy = 1;
cons.gridwidth = 1;
lay.setConstraints(jb3, cons);
add(jb3);
cons.gridx = 1;
lay.setConstraints(jb4, cons);
add(jb4);
cons.gridx = 2;
lay.setConstraints(jb5, cons);
add(jb5);
cons.gridx = 3;
lay.setConstraints(jb6, cons);
add(jb6);
cons.gridx = 0; cons.gridy = 2;
lay.setConstraints(jb7, cons);
add(jb7);
cons.gridx = 1; cons.gridy = 2;
cons.gridwidth = 2;
lay.setConstraints(jb8, cons);
add(jb8);
cons.gridx = 3; cons.gridy = 2;
cons.gridwidth = 1;
lay.setConstraints(jb9, cons);
add(jb9);
然后我得到了这个:
但我不想第二排
5条答案
按热度按时间oxcyiej71#
我会为每一行使用一个额外的
JPanel
,并且不会扩展JFrame
(除非需要,即向其添加功能):结果:
只有一种方法可以做到这一点,非常依赖于如何调整组件的大小,如果图形用户界面的大小改变
还要注意,大小将根据首选大小(即标签内容)而变化
mec1mxoz2#
这个GUI很难实现的原因是GridBagLayout没有任何东西可以用来调整四列的大小
GridBagLayout
确实有一些属性,允许您为没有组件的列定义默认值,如下所示:注:您还可以查看:https://stackoverflow.com/a/57463596/131872,其中有一个更复杂的例子,展示了如何将这种方法用于按钮的“键盘”布局。
q1qsirdb3#
GridBagLayout关注的是对齐,而不是比例。有时它可以用来布置大小相等的组件,但它并不擅长于此。
然而,SpringLayout在这方面做得很好,并且有专门的方法来做这件事。代价是SpringLayout很难使用,而且很容易被错误地使用。它的工作原理类似于20世纪90年代的“表单布局”。对于布局中的每个组件,您必须声明至少一个水平边缘和一个垂直边缘应该位于相对于容器边缘或相对于其他子组件边缘的位置。
首先,最好创建容器,而不是扩展JFrame。子类化JFrame是没有意义的,因为你只是在使用JFrame,而不是改变它的行为:
接下来,让我们计算小按钮的一致大小:
接下来,让我们将按钮1、2和4的宽度设置为两倍:
现在我们可以使用这些Spring为每个按钮创建constraints:
最后,我们需要告诉布局容器本身应该有多大。它需要足够宽以容纳jb2和jb5,并且足够高以容纳jb3、jb4和jb5。我们可以使用其中任何一个来指定容器的首选大小,但jb5可能是最简单的选择:
把所有这些放在一起看起来像这样:
oiopk7p54#
任何合适的复杂UI/布局都应该拆分为多个组件。这通常称为“复合布局”。
这使您能够更好地专注于布局的每个“区域”的单独需求。
有时候,你只需要假装。
GridBagConstraints#insets
的使用 *现在,我不知道你怎么想,但我很想创建某种工厂方法,它会根据每行中所需的元素数量创建每行...但那就是我😉
但布局有点不同按钮4(和布局中的7)应该与按钮1和2大小相同,但在您的情况下,它们是1和2大小的2/3,按钮3和5应该是1和2的1/2,这里是2/3
然后相应地更改列
weightx
属性,例如...现在,请记住,组件自己的首选大小发挥这一点。如果没有额外的
ipadx
,所有三个元素都可以在可用的容器区域中按其首选大小进行布局。而且,不,你不“需要”为每一列指定
weightx
,这只是一个演示,但有时,你可能会发现在你的愿望中绝对更有用。3hvapo4f5#
我终于得到了这个图形用户界面的工作,但我不得不使用两个黑客,我不建议使用。
Oracle有一个有用的教程Creating a GUI With Swing。跳过使用NetBeans IDE学习Swing部分。
这个GUI很难实现的原因是
GridBagLayout
没有用于调整四列大小的东西。因此,借用OP,我在创建JButtons
行之前创建了一行空的JLabels
。我根据JButton
的大小调整了JLabels
的大小。在尝试之前我并不确定,但是
gridheight
为零会使JLabels
与JButtons
的第一行保持在相同的物理位置。下面是完整的、丑陋的、可运行的代码。