我试图达到Setting an arbitrary width in GridBagLayout所需的最终结果。
为便于参考,这里是:
这是目前的结果:
按钮编号和行以1,1
格式显示,后跟为此单元格声明的列数(2)
。
正如您所看到的,它从按钮1,1 (3)
开始,在1,2 (4)
下方宽度相同,同时声明不同数量的列。
任何人都可以确定如何更正代码吗?
当前代码:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class KeyBoardLayout {
private JComponent ui = null;
KeyBoardLayout() {
initUI();
}
public void initUI() {
if (ui!=null) return;
ui = new JPanel(new GridBagLayout());
ui.setBorder(new EmptyBorder(4,4,4,4));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
ui.add(new JButton("1,1 (3)"), gbc);
gbc.gridx = 3;
gbc.gridwidth = 2;
ui.add(new JButton("2,1 (2)"), gbc);
gbc.gridx = 5;
ui.add(new JButton("3,1 (2)"), gbc);
gbc.gridx = 7;
ui.add(new JButton("4,1 (2)"), gbc);
gbc.gridx = 9;
ui.add(new JButton("5,1 (2)"), gbc);
gbc.gridx = 11;
ui.add(new JButton("6,1 (2)"), gbc);
gbc.gridx = 13;
ui.add(new JButton("7,1 (2)"), gbc);
gbc.gridx = 15;
gbc.gridwidth = 3;
ui.add(new JButton("8,1 (3)"), gbc);
gbc.gridx = 18;
gbc.gridwidth = 4;
ui.add(new JButton("9,1 (4)"), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
ui.add(new JButton("1,2 (4)"), gbc);
gbc.gridx = 4;
gbc.gridwidth = 2;
ui.add(new JButton("2,2 (2)"), gbc);
gbc.gridx = 6;
ui.add(new JButton("3,2 (2)"), gbc);
gbc.gridx = 8;
ui.add(new JButton("4,2 (2)"), gbc);
gbc.gridx = 10;
ui.add(new JButton("5,2 (2)"), gbc);
gbc.gridx = 12;
ui.add(new JButton("6,2 (2)"), gbc);
gbc.gridx = 14;
ui.add(new JButton("7,2 (2)"), gbc);
gbc.gridx = 16;
ui.add(new JButton("8,2 (2)"), gbc);
gbc.gridx = 18;
gbc.gridwidth = 4;
ui.add(new JButton("9,2 (4)"), gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 5;
ui.add(new JButton("1,3 (5)"), gbc);
gbc.gridx = 5;
gbc.gridwidth = 2;
ui.add(new JButton("2,3 (2)"), gbc);
gbc.gridx = 7;
ui.add(new JButton("3,3 (2)"), gbc);
gbc.gridx = 9;
ui.add(new JButton("4,3 (2)"), gbc);
gbc.gridx = 11;
ui.add(new JButton("5,3 (2)"), gbc);
gbc.gridx = 13;
ui.add(new JButton("6,3 (2)"), gbc);
gbc.gridx = 15;
ui.add(new JButton("7,3 (2)"), gbc);
gbc.gridx = 17;
ui.add(new JButton("8,3 (2)"), gbc);
gbc.gridx = 19;
gbc.gridwidth = 3;
ui.add(new JButton("9,3 (3)"), gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 3;
ui.add(new JButton("1,4 (3)"), gbc);
gbc.gridx = 3;
ui.add(new JButton("2,4 (3)"), gbc);
gbc.gridx = 6;
gbc.gridwidth = 10;
ui.add(new JButton("3,4 (10)"), gbc);
gbc.gridx = 16;
gbc.gridwidth = 3;
ui.add(new JButton("4,4 (3)"), gbc);
gbc.gridx = 19;
ui.add(new JButton("5,4 (3)"), gbc);
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
KeyBoardLayout o = new KeyBoardLayout();
JFrame f = new JFrame("Keyboard Layout");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
答案 0 :(得分:5)
认为我得到了它的工作。我创建了一个包含22个组件的行,每个组件占用一列:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class KeyBoardLayout {
private JComponent ui = null;
KeyBoardLayout() {
initUI();
}
public void initUI() {
if (ui!=null) return;
ui = new JPanel(new GridBagLayout());
ui.setBorder(new EmptyBorder(4,4,4,4));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
// gbc.gridy = 0;
gbc.gridy = 1;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
ui.add(new JButton("1,1 (3)"), gbc);
gbc.gridx = 3;
gbc.gridwidth = 2;
ui.add(new JButton("2,1 (2)"), gbc);
gbc.gridx = 5;
ui.add(new JButton("3,1 (2)"), gbc);
gbc.gridx = 7;
ui.add(new JButton("4,1 (2)"), gbc);
gbc.gridx = 9;
ui.add(new JButton("5,1 (2)"), gbc);
gbc.gridx = 11;
ui.add(new JButton("6,1 (2)"), gbc);
gbc.gridx = 13;
ui.add(new JButton("7,1 (2)"), gbc);
gbc.gridx = 15;
gbc.gridwidth = 3;
ui.add(new JButton("8,1 (3)"), gbc);
gbc.gridx = 18;
gbc.gridwidth = 4;
ui.add(new JButton("9,1 (4)"), gbc);
gbc.gridx = 0;
// gbc.gridy = 1;
gbc.gridy = 2;
ui.add(new JButton("1,2 (4)"), gbc);
gbc.gridx = 4;
gbc.gridwidth = 2;
ui.add(new JButton("2,2 (2)"), gbc);
gbc.gridx = 6;
ui.add(new JButton("3,2 (2)"), gbc);
gbc.gridx = 8;
ui.add(new JButton("4,2 (2)"), gbc);
gbc.gridx = 10;
ui.add(new JButton("5,2 (2)"), gbc);
gbc.gridx = 12;
ui.add(new JButton("6,2 (2)"), gbc);
gbc.gridx = 14;
ui.add(new JButton("7,2 (2)"), gbc);
gbc.gridx = 16;
ui.add(new JButton("8,2 (2)"), gbc);
gbc.gridx = 18;
gbc.gridwidth = 4;
ui.add(new JButton("9,2 (4)"), gbc);
gbc.gridx = 0;
// gbc.gridy = 2;
gbc.gridy = 3;
gbc.gridwidth = 5;
ui.add(new JButton("1,3 (5)"), gbc);
gbc.gridx = 5;
gbc.gridwidth = 2;
ui.add(new JButton("2,3 (2)"), gbc);
gbc.gridx = 7;
ui.add(new JButton("3,3 (2)"), gbc);
gbc.gridx = 9;
ui.add(new JButton("4,3 (2)"), gbc);
gbc.gridx = 11;
ui.add(new JButton("5,3 (2)"), gbc);
gbc.gridx = 13;
ui.add(new JButton("6,3 (2)"), gbc);
gbc.gridx = 15;
ui.add(new JButton("7,3 (2)"), gbc);
gbc.gridx = 17;
ui.add(new JButton("8,3 (2)"), gbc);
gbc.gridx = 19;
gbc.gridwidth = 3;
ui.add(new JButton("9,3 (3)"), gbc);
gbc.gridx = 0;
// gbc.gridy = 3;
gbc.gridy = 4;
gbc.gridwidth = 3;
ui.add(new JButton("1,4 (3)"), gbc);
gbc.gridx = 3;
ui.add(new JButton("2,4 (3)"), gbc);
gbc.gridx = 6;
gbc.gridwidth = 10;
ui.add(new JButton("3,4 (10)"), gbc);
gbc.gridx = 16;
gbc.gridwidth = 3;
ui.add(new JButton("4,4 (3)"), gbc);
gbc.gridx = 19;
ui.add(new JButton("5,4 (3)"), gbc);
gbc.gridx = 0;
gbc.gridy = 4;
gbc.gridwidth = 1;
for (int i = 0; i < 22; i++)
{
gbc.gridx = i;
gbc.gridy = 4;
ui.add(new JButton());
// ui.add(Box.createHorizontalStrut(15));
}
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
KeyBoardLayout o = new KeyBoardLayout();
JFrame f = new JFrame("Keyboard Layout");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
当然,您不希望按钮显示,因此您也可以使用隐形组件。
现在,我有一个自己的问题。为什么按钮出现在第一行,即使我设置了gridy = 4
?
答案 1 :(得分:2)
我担心简单的GridBagLayout限制所需的布局并不那么简单。 GBL不考虑网格宽度的比例。这意味着它无法检测到组件宽度的2/3。 所以,如果你定义
c1 (gridwidth=2) c2 (gridwidth=1)
c3 (gridwidth=3)
期待得到
|****|**|
|*******|
结果将是
|**|**|
|*****|
camickr的例子是有效的,因为定义了简单的单元格高度,恕我直言是唯一的方法。
答案 2 :(得分:1)
在图片中,每行包含5到8个按钮,这意味着GridBagLayout
仅知道8个单独列的宽度。
将(..)中的数字相加,表示每一行的总数gridwidth
。总数是22。
GridBagLayout
不知道如何将8列变成22列。它不知道要在列中没有组件的列使用什么宽度。因此,布局不知道如何处理gridwidth
约束。
解决方案是告诉GridBagLayout
网格中预期的列数以及网格中每一列的最小宽度。
这可以通过设置GridBagLayout
本身的值来完成:
//ui = new JPanel(new GridBagLayout());
int[] columns = new int[22];
Arrays.fill(columns, 30);
GridBagLayout gbl = new GridBagLayout();
gbl.columnWidths = columns;
ui = new JPanel(gbl);
数组的大小定义列数。
分配给数组中每个条目的值是该列的“最小宽度”(每个列可以不同)。
现在GridBagLayout
知道如何计算每一列的宽度,并使用gridwidth
作为每个组件的约束将按预期工作。
更新的代码如下:
import java.awt.*;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class KeyBoardLayout {
private JComponent ui = null;
KeyBoardLayout() {
initUI();
}
public void initUI() {
if (ui!=null) return;
//ui = new JPanel(new GridBagLayout());
int[] columns = new int[22];
Arrays.fill(columns, 30);
GridBagLayout gbl = new GridBagLayout();
gbl.columnWidths = columns;
ui = new JPanel(gbl);
ui.setBorder(new EmptyBorder(4,4,4,4));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
ui.add(new JButton("1,1 (3)"), gbc);
gbc.gridx = 3;
gbc.gridwidth = 2;
ui.add(new JButton("2,1 (2)"), gbc);
gbc.gridx = 5;
ui.add(new JButton("3,1 (2)"), gbc);
gbc.gridx = 7;
ui.add(new JButton("4,1 (2)"), gbc);
gbc.gridx = 9;
ui.add(new JButton("5,1 (2)"), gbc);
gbc.gridx = 11;
ui.add(new JButton("6,1 (2)"), gbc);
gbc.gridx = 13;
ui.add(new JButton("7,1 (2)"), gbc);
gbc.gridx = 15;
gbc.gridwidth = 3;
ui.add(new JButton("8,1 (3)"), gbc);
gbc.gridx = 18;
gbc.gridwidth = 4;
ui.add(new JButton("9,1 (4)"), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
ui.add(new JButton("1,2 (4)"), gbc);
gbc.gridx = 4;
gbc.gridwidth = 2;
ui.add(new JButton("2,2 (2)"), gbc);
gbc.gridx = 6;
ui.add(new JButton("3,2 (2)"), gbc);
gbc.gridx = 8;
ui.add(new JButton("4,2 (2)"), gbc);
gbc.gridx = 10;
ui.add(new JButton("5,2 (2)"), gbc);
gbc.gridx = 12;
ui.add(new JButton("6,2 (2)"), gbc);
gbc.gridx = 14;
ui.add(new JButton("7,2 (2)"), gbc);
gbc.gridx = 16;
ui.add(new JButton("8,2 (2)"), gbc);
gbc.gridx = 18;
gbc.gridwidth = 4;
ui.add(new JButton("9,2 (4)"), gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 5;
ui.add(new JButton("1,3 (5)"), gbc);
gbc.gridx = 5;
gbc.gridwidth = 2;
ui.add(new JButton("2,3 (2)"), gbc);
gbc.gridx = 7;
ui.add(new JButton("3,3 (2)"), gbc);
gbc.gridx = 9;
ui.add(new JButton("4,3 (2)"), gbc);
gbc.gridx = 11;
ui.add(new JButton("5,3 (2)"), gbc);
gbc.gridx = 13;
ui.add(new JButton("6,3 (2)"), gbc);
gbc.gridx = 15;
ui.add(new JButton("7,3 (2)"), gbc);
gbc.gridx = 17;
ui.add(new JButton("8,3 (2)"), gbc);
gbc.gridx = 19;
gbc.gridwidth = 3;
ui.add(new JButton("9,3 (3)"), gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 3;
ui.add(new JButton("1,4 (3)"), gbc);
gbc.gridx = 3;
ui.add(new JButton("2,4 (3)"), gbc);
gbc.gridx = 6;
gbc.gridwidth = 10;
ui.add(new JButton("3,4 (10)"), gbc);
gbc.gridx = 16;
gbc.gridwidth = 3;
ui.add(new JButton("4,4 (3)"), gbc);
gbc.gridx = 19;
ui.add(new JButton("5,4 (3)"), gbc);
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
KeyBoardLayout o = new KeyBoardLayout();
JFrame f = new JFrame("Keyboard Layout");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
这种方法也可以用于行。
这意味着GridBagLayout
提供了创建网格的功能,并且只用组件填充了网格的几个单元格。