GridLayout和GridBagLayout中的元素之间的间隔

问题描述 投票:0回答:1

我正在尝试创建一个文本字段网格,我希望它看起来像这样:

enter image description here

我正在尝试使用Swing来执行此操作,但是在创建网格时遇到了麻烦。我已经尝试过GridBagLayoutGridLayout来完成此操作,但是都遇到了相同的问题-我无法删除文本字段之间的空格。

enter image description here

以上图像使用网格袋布局。我尝试过更改插图以及每个文本字段的权重,但无法摆脱字段之间的空格。

网格布局稍微好一些:

enter image description here

但是它有同样的问题。我尝试将每个文本字段添加到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();
        }
    });
}
}
java swing layout-manager grid-layout gridbaglayout
1个回答
2
投票

我想您会发现,这与MacOS的外观和风格有关,因为它在文本字段周围添加了一个空边框以突出显示焦点

您可以看到下面突出显示的内容

Focus Rect

最简单的删除方法是删除或替换边框,例如...

Custom Border

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);
            }
        }
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.