【发布时间】:2020-04-26 23:50:54
【问题描述】:
我正在尝试创建一个文本字段网格,我设想它看起来像这样:
我正在尝试使用 Swing 来执行此操作,但在创建网格时遇到了麻烦。我已经尝试过 GridBagLayout 和 GridLayout 来完成此操作,但两者都有相同的问题 - 我无法删除文本字段之间的空格。
上图使用网格包布局。我尝试更改每个文本字段的插图和权重,但无法消除字段之间的空格。
网格布局略好:
但它也有同样的问题。我尝试将每个文本字段添加到 JPanel,然后为每个面板创建一个空边框,但这也不起作用。
我已经附上了这两种实现的代码。我不承诺使用JTextField,所以如果用户可以输入其他元素,我也愿意尝试一下。任何帮助摆脱每个文本字段之间的空格将不胜感激!
GridBagLayoutDemo
class GridBagLayoutDemo {
public static void addComponentsToPane(Container pane) {
GridBagLayout gbl = new GridBagLayout();
pane.setLayout(gbl);
GridBagConstraints c = new GridBagConstraints();
int rows = 2;
int cols = 2;
for(int i = 0; i < (rows + 1) * 3; i++){
JTextField textField = new JTextField(1);
textField.setFont( new Font("Serif", Font.PLAIN, 30) );
JPanel tempPanel = new JPanel();
tempPanel.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
tempPanel.add(textField);
c.gridx = i % (rows + 1);
c.gridy = i / (cols + 1);
c.gridheight = 1;
c.gridwidth = 1;
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.fill = GridBagConstraints.HORIZONTAL;
pane.add(tempPanel, c);
}
gbl.setConstraints(pane, c);
c.insets = new Insets(0,0,0,0);
}
public void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("GridBagLayoutDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
addComponentsToPane(frame.getContentPane());
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
GridBagLayoutDemo demo = new GridBagLayoutDemo();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
demo.createAndShowGUI();
}
});
}
}
GridLayoutDemo
class GridLayoutDemo {
public void createAndShowGUI() {
JFrame frame = new JFrame("GridLayout");
//frame.setOpacity(0L);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel parentPanel = new JPanel();
GridLayout layout = new GridLayout(3, 3, 0, 0);
layout.setHgap(0);
layout.setVgap(0);
parentPanel.setLayout(layout);
for(int i = 0 ; i < 9; i++){
JTextField textField = new JTextField();
textField.setHorizontalAlignment(JTextField.CENTER);
// JPanel tempPanel = new JPanel();
//textField.setBounds(0, 0, 10 , 10);
//textField.setFont( new Font("Serif", Font.PLAIN, 18));
//tempPanel.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
//tempPanel.add(textField);
// tempPanel.add(textField);
parentPanel.add(textField);
}
frame.add(parentPanel);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
GridLayoutDemo demo = new GridLayoutDemo();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
demo.createAndShowGUI();
}
});
}
}
【问题讨论】:
-
我没有答案,但我有一个建议。设置背景窗格的背景颜色,以及几个文本字段(不同的颜色)。这样您就可以区分放置字段的布局和字段本身。
-
我试过这个,发现多余的空间归因于Jtextfield默认边框。我创建了一个空边框并且能够删除空格。
-
我想你会发现这是 MacOS 而不是 Java 的问题
标签: java swing layout-manager grid-layout gridbaglayout