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 ] 每行)。
不过我没测试过
我有一个每 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 ] 每行)。
不过我没测试过