英文:
Java Swing Component
问题
我对Java Swing和布局还比较新。我想要创建一个类似这样的组件:
Comp 3的高度跨越1和2。所以,我想我将不得不使用覆盖布局来将comp 3定位在1和2的后面。我希望它们以相同的比例调整大小(可以任意决定)。我该如何实现这个?
英文:
I am quite new to Java Swing and layouts. I want to create a component like this:
Comp 3 spans the height of 1 and 2. So, I imagine I will have to use overlay layout to position comp 3 behind 1 and 2. I want them to resize in these same proportions (they can be arbitrarily decided). How can I achieve this?
答案1
得分: 1
您可以使用一个或多个GridBagLayout
布局管理器的组合。GridBagLayout
允许您以网格方式放置元素,通过使用GridBagConstraints
类来指定比例和位置。
public void setupLayout() {
JPanel container = new JPanel(); // 元素的主要容器
// 根据您的屏幕截图,创建编号面板
JPanel panel1 = new JPanel(), panel2 = new JPanel(),
panel3 = new JPanel(), panel4 = new JPanel();
panel1.setBackground(Color.RED); // 为了更好的可视化,设置不同的颜色
panel2.setBackground(Color.BLUE);
panel3.setBackground(Color.YELLOW);
panel4.setBackground(Color.GREEN);
container.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = gbc.gridheight = 1;
gbc.weightx = 1;
gbc.gridx = 0; gbc.gridy = 0; gbc.weighty = 0.2;
container.add(panel1, gbc);
gbc.gridy = 1; gbc.weighty = 0.3;
container.add(panel2, gbc);
gbc.gridy = 2; gbc.weighty = 0.5;
container.add(panel3, gbc);
gbc.gridx = 1; gbc.gridy = 0; gbc.gridheight = 3;
container.add(panel4, gbc);
// 放置容器在框架或其他用途上...
}
属性gridx
和gridy
指定了您在网格上的位置。weightx
和weighty
指定了它们占用的空间比例(从0到1)。
与gridwidth
和gridheight
不同,它们指定了一个单元格相对于其他单元格占用多少空间。一个单元格将占用与gridheight
单元格在垂直方向上占用的空间或gridwidth
单元格在水平方向上占用的空间相等的空间。因此,以实际示例来解释,由于panel1
设置为weighty = 0.2
,panel2
设置为weighty = 0.3
,而panel3
设置为weighty = 0.5
,我们表示无论哪个单元格在第一行,都将始终占用垂直空间的0.2,第二行占用垂直空间的0.3,第三行占用一半(0.5)的垂直空间,因此,panel4
将占用与之前的单元格高度总和相等的空间。如果panel4
设置为gridheight = 2
,它将占用两行的空间,因为在这个示例中,它放置在第一行,所以它将占用等于第一行和第二行之和的空间,即一半的垂直空间(0.2 + 0.3
),但由于我们将其设置为3
,这也是这个示例中的最大行数,它将占用所有垂直空间。混淆gridwidth
/gridheight
和weightx
/weighty
是常见的,因此您必须注意它们之间的区别。请注意,使用gridwidth
/gridheight
/weightx
/weighty
只会“保留”您指定的空间,元素将放置在该空间内,锚定在anchor
属性中指定的一侧。
为了使元素扩展到其保留的空间,我们设置了gbc.fill = GridBagConstraints.BOTH
,其中BOTH
代表水平和垂直两个方向上都填充空间(另外三个选项分别是GridBagConstraints.HORIZONTAL
,GridBagConstraints.VERTICAL
和GridBagConstraints.NONE
,它是默认值,表示不填充)。
英文:
You can use a combination of one or multiple GridBagLayout
layout managers.<br>GridBagLayout
allows you to place your elements in a grid-like manner by specifiying the proportions and positioning using the class GridBagConstraints
.
public void setupLayout() {
JPanel container = new JPanel(); // the main holder of the elements
// The numbered panels according to your screenshot
JPanel panel1 = new JPanel(), panel2 = new JPanel(),
panel3 = new JPanel(), panel4 = new JPanel();
panel1.setBackground(Color.RED); // giving them colors for better visualization
panel2.setBackground(Color.BLUE);
panel3.setBackground(Color.YELLOW);
panel4.setBackground(Color.GREEN);
container.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = gbc.gridheight = 1;
gbc.weightx = 1;
gbc.gridx = 0; gbc.gridy = 0; gbc.weighty = 0.2;
panel.add(panel1,gbc);
gbc.gridy = 1; gbc.weighty = 0.3;
panel.add(panel2,gbc);
gbc.gridy = 2; gbc.weighty = 0.5;
panel.add(panel3,gbc);
gbc.gridx = 1; gbc.gridy = 0; gbc.gridheight = 3;
panel.add(panel4,gbc);
// Code to place your container in a frame or whatever usage you have for it...
}
The properties gridx
and gridy
specify the position you are on the grid.<br>weightx
and weighty
specify how much space (on a 0 to 1 proportion) they take up.
<br>Unlike gridwidth
and gridheight
they specify how much does a cell take up relative to other cells so a cell will take up a space equal to the space that gridheight
cells take up vetically or gridwidth
cells take up horizontally.<br>So, to be explained in action, since panel1
is set to weighty = 0.2
, panel2
is set to weighty = 0.3
and panel3
is set to weighty = 0.5
we're saying that whatever cell is on the first row, will always take 0.2
of the vertical space, second row 0.3
of vertical space and third row half (0.5
) the vertical space, therefore panel4
will take up the same space as how many cells heights sum up to the prior, if panel4
was set to gridheight = 2
, it will take as much space as two rows take up, since in this example it's placed on the first row, it will take up therefore a space equivalent to that of the first and second rows, which is half the vertical space (0.2 + 0.3
), but since we set it to 3
which is also the maximum number of rows in this example, it will take up all of the vertical space.<br>Mixing up gridwidth
/gridheight
and weightx
/weighty
is commmon therefore you have to be aware of the difference.<br>Note that using the gridwidth
/gridheight
/weightx
/weighty
will only "reserve" the space you're specifying, and the elements will be placed inside that spaced anchored to the side specified in the anchor
property.
<br>In order to make the elements scale up to their reserved space we set gbc.fill = GridBagConstraints.BOTH
where BOTH
stands for filling up the space both horizontally and vertically (the other three choices being, clearly, GridBagConstraints.HORIZONTAL
, GridBagConstraints.VERTICAL
and GridBagConstraints.NONE
which is the default value that represents no filling at all.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论