Пробелы между элементами в GridLayout и GridBagLayout - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать сетку текстовых полей, которые, как я предполагаю, будут выглядеть так:

enter image description here

Я пытаюсь использовать Swing для того, чтобы сделать это, но у меня проблемы с созданием сетки. Я пробовал и GridBagLayout, и GridLayout, чтобы выполнить sh, но у меня была та же проблема с обоими - я не могу удалить пробелы между текстовыми полями.

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();
        }
    });
}
}

1 Ответ

2 голосов
/ 27 апреля 2020

Я думаю, вы обнаружите, что это проблема внешнего вида 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);
            }
        }
    }
}
...