Java Swing GridBagLayout() 跨越对象 3 行不起作用

Java Swing GridBagLayout() Spanning an object 3 lines doesn't work

我有一个每 5 列 5 行的 GridBagLayout。我试图跨越我的第一个对象,它是 3 行和 5 列的 TilePanel。它部分工作。

我有第 4 行和第 5 行的对象。我预计前 3 行将比第 4 行和第 5 行占用更多 space。实际上,space 平均分配到 Window。我究竟做错了什么?请参阅下面的代码片段和屏幕截图:

setLayout(new GridBagLayout());

GridBagConstraints grid = new GridBagConstraints();


// Initialize all the UI components
tilePanel = new TilePanel(gameModel);

grid.fill = GridBagConstraints.BOTH;

// Grid 5 lines by 5 columns
grid.weightx = 5;
grid.weighty = 5;

// tilePanel takes 3 lines and 5 columns
grid.gridwidth = 5;
grid.gridheight = 3;
grid.gridx = 0;
grid.gridy = 0;
this.add(tilePanel, grid);

// Forth Line       
goal = new JLabel("Goal: " + gameModel.getGameResult());
currentSum = new JLabel("Current sum: 0");
nextButton = new JButton("NEXT");
resetButton = new JButton("RESET");

grid.gridwidth = 1;
grid.gridheight = 1; 

// Forth Line: First column
grid.gridy = 4;
grid.gridx = 0;     
this.add(nextButton, grid);

// Forth Line: Second column
grid.gridx = 1;
this.add(resetButton, grid);


// Firth Line
grid.gridy = 5;

// Firth Line: First column
grid.gridx = 0;
goal.setBorder(new LineBorder(Color.BLACK, 1));
this.add(goal, grid);

// Firth Line: Second column
grid.gridx = 1;
currentSum.setBorder(new LineBorder(Color.BLACK, 1));
this.add(currentSum, grid);

// Firth Line: Third column
grid.gridx = 2;
this.add(new JLabel("TIME"), grid);     

// Firth Line: Fourth column
grid.gridx = 3;
this.add(new JLabel("RESET"), grid);    

// Firth Line: Fifth column
grid.gridx = 4;
this.add(new JLabel("LEVEL"), grid);

Window的截图:

I'm trying to span my first object which is a TilePanel on the 3 lines

你不能只说一个组件跨越 3 行。

任何给定行的高度由添加到该行的组件的高度决定。如果您不向一条线添加组件,则该线没有高度。

在您的示例中,您添加了 gridy 为 0、4、5 的组件。因此 gridy 中没有组件为 1、2、3,因此每个网格都有一个 0身高.

如果每行中都有组件,则只能跨行。因此,如果您添加了 5 个组件,其中 gridy 为 0、1、2、3、4,那么您可以添加第 6 个组件(到另一列),其中 gridy 为 0,gridheight of 3。那么这个组件的高度将等于网格 0、1 和 2 中组件的高度。

如果您希望第一行更大,那么也许您可以使用 ipady 值给标题面板额外的 space。阅读有关 How to Use GridBagLayout 的 Swing 教程部分,了解有关所有约束和工作示例的更多信息。

weightx和weighty应该是浮点数,最小值在0.0,最大值在1.0。值 1.0 表示 "get as much space as you can",0.0 表示 "you are the last one to get extra space"。您给出 5 的值,并且 GridBagLayout 可能正在制作...无论它制作什么。

我会尝试在添加 tilePanel 时将 weigthx 设置为 1.0 和 weighty=0.6(垂直的 60% space),在添加其余部分(垂直的 20% space 时设置 weighty=0.2 ] 每行)。

不过我没测试过