对不起,我还是不明白。这是问题的延续,而不是试图回答。
我一直无法弄清楚 GridBagLayout;对我来说,这是一个没有解释的组件的典型示例。我从未见过对其许多约束等的解释,只是示例。但是我想做的从来都不像例子,我讨厌通过反复试验来解决它,希望能在一个组合上实现我想要的。多么好的编程方式。
编辑:好的,现在这是一个答案,至少是对后续问题的回答。通过典型的反复试验,我相信我已经发现了缺失的原则,并在此处提供它,这样当有人在官方文档中查找它时它可能会丢失。
Oracle“如何使用 GridBagLayout”包含以下内容:“...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 的原因......