Java GridLayout和GridBagLayout中元素之间的间距
我正在尝试创建一个文本字段网格,我设想它如下所示: 我试图使用Swing来实现这一点,但在创建网格时遇到了问题。为了实现这一点,我尝试了Java GridLayout和GridBagLayout中元素之间的间距,java,swing,layout-manager,grid-layout,gridbaglayout,Java,Swing,Layout Manager,Grid Layout,Gridbaglayout,我正在尝试创建一个文本字段网格,我设想它如下所示: 我试图使用Swing来实现这一点,但在创建网格时遇到了问题。为了实现这一点,我尝试了GridBagLayout和GridBagLayout,但两者都有相同的问题-我无法删除文本字段之间的空格 上图使用网格袋布局。我曾尝试更改每个文本字段的插入和权重,但未能消除字段之间的空格 网格布局稍好一些: 但它也有同样的问题。我尝试将每个文本字段添加到JPanel,然后为每个面板创建一个空边框,但这也不起作用 我已经附上了这两种实现的代码。我不打算使
GridBagLayout
和GridBagLayout
,但两者都有相同的问题-我无法删除文本字段之间的空格
上图使用网格袋布局。我曾尝试更改每个文本字段的插入和权重,但未能消除字段之间的空格
网格布局稍好一些:
但它也有同样的问题。我尝试将每个文本字段添加到JPanel
,然后为每个面板创建一个空边框,但这也不起作用
我已经附上了这两种实现的代码。我不打算使用JTextField
,因此如果用户可以输入其他元素,我也愿意尝试一下。任何帮助消除每个文本字段之间的空格都将不胜感激
GridBagLayoutDemo
我想您会发现这是MacOS外观的一个问题,因为它在文本字段周围添加了一个空白边框,以允许焦点突出显示 您可以看到它在下面突出显示 移除边框的最简单方法是移除或替换边框,例如
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
公共班机{
公共静态void main(字符串[]args){
新的Main();
}
公用干管(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=1;
gbc.weighty=1;
int行=3;
int cols=3;
对于(int index=0;index<(行*cols);index++){
int行=索引%行;
int col=索引/cols;
gbc.gridy=行;
gbc.gridx=col;
JTextField textField=新的JTextField(4);
textField.setText(col+“x”+行);
textField.setboorder(新的线边框(颜色为深灰色));
添加(文本字段,gbc);
}
}
}
}
我想您会发现这是MacOS外观的一个问题,因为它在文本字段周围添加了一个空白边框,以便突出显示焦点
您可以看到它在下面突出显示
移除边框的最简单方法是移除或替换边框,例如
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
公共班机{
公共静态void main(字符串[]args){
新的Main();
}
公用干管(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=1;
gbc.weighty=1;
int行=3;
int cols=3;
对于(int index=0;index<(行*cols);index++){
int行=索引%行;
int col=索引/cols;
gbc.gridy=行;
gbc.gridx=col;
JTextField textField=新的JTextField(4);
textField.setText(col+“x”+行);
textField.setboorder(新的线边框(颜色为深灰色));
添加(文本字段,gbc);
}
}
}
}
我没有答案,但我有一个建议。设置背景窗格的背景色,以及两个文本字段(不同颜色)。通过这种方式,您将能够区分放置字段的布局和字段本身的布局之间的差异。我尝试了这种方法,发现额外的空间归因于Jtextfield默认边框。我创建了一个空边框,并能够删除空格。我想你会发现这是MacOS的问题,而不是Java的问题。我没有答案,但我有一个建议。设置背景窗格的背景色,以及两个文本字段(不同颜色)。通过这种方式,您将能够区分放置字段的布局和字段本身的布局之间的差异。我尝试了这种方法,发现额外的空间归因于Jtextfield默认边框。我创建了一个空边框,并且能够删除空格。我想你会发现这是MacOS的问题,而不是Java的问题
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();
}
});
}
}
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();
}
});
}
}
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
int rows = 3;
int cols = 3;
for (int index = 0; index < (rows * cols); index++) {
int row = index % rows;
int col = index / cols;
gbc.gridy = row;
gbc.gridx = col;
JTextField textField = new JTextField(4);
textField.setText(col + "x" + row);
textField.setBorder(new LineBorder(Color.DARK_GRAY));
add(textField, gbc);
}
}
}
}