Java Swing GridBagLayout: возможно ли создавать строки с разным количеством столбцов? - PullRequest
2 голосов
/ 27 апреля 2020

Я новичок в Java Swing, и мне нужно кодировать интерфейс, который выглядит следующим образом:

enter image description here

Это флажок, за которым следует текстовое поле, а затем кнопка. Не обращайте внимания на пунктирные линии, я добавил их просто для того, чтобы сделать «сетку» видимой, и я понимаю, что могу просто сделать компонент и повторно использовать его для флажка, текста и кнопки, чтобы макет был намного проще. Я просто пытаюсь понять причуды GridbagLayout.

В основном, первая строка должна иметь 2 столбца, а вторая и третья - 6 столбцов. Для этого я пытаюсь использовать GridBagLayout, но результат не является ожидаемым, и я не уверен, что я что-то упустил или невозможно без внутренних панелей. Это мой класс:

import javax.swing.*;
import java.awt.*;

public class GridBagLayoutTest extends JFrame {

    JPanel panel = new JPanel();

    public GridBagLayoutTest(){

        setTitle("Grid Bag Layout Test");
        GridBagLayout layout = new GridBagLayout();
        panel.setLayout(layout);
        GridBagConstraints gbc = new GridBagConstraints();
        setLayout(new GridBagLayout());

        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx=1; // set to use all horizontal space available
        gbc.weighty=0;

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(2,2,2,2);

        // Labels line. Each label should be 50%
        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(new JLabel("Label 1"), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        panel.add(new JLabel("Label 2"), gbc);

        // Checkbox left group. The three components should take 50% of the total width
        gbc.gridx = 0;
        gbc.gridy = 1;
        panel.add(new JCheckBox("Ind 1"), gbc);

        gbc.gridx = 1;
        gbc.gridy = 1;
        panel.add(new JTextField(), gbc);

        gbc.gridx = 2;
        gbc.gridy = 1;
        panel.add(new JButton("..."), gbc);

        // Checkbox right group. The three components should take 50% of the total width
        gbc.gridx = 3;
        gbc.gridy = 1;
        panel.add(new JCheckBox("Ind 1"), gbc);

        gbc.gridx = 4;
        gbc.gridy = 1;
        panel.add(new JTextField(), gbc);

        gbc.gridx = 5;
        gbc.gridy = 1;
        panel.add(new JButton("..."), gbc);


        setContentPane(panel);
        this.setSize(800,200 );
        setPreferredSize(getSize());
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

Вопрос: если возможно достичь этого без внутренних панелей, что мне не хватает в моем коде?

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 27 апреля 2020
    gbc.gridx = 0;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 1"), gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 2"), gbc);

Ваш второй ярлык должен начинаться в столбце 3:

    gbc.gridx = 0;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 1"), gbc);

    gbc.gridx = 3; // changed
    gbc.gridy = 0;
    panel.add(new JLabel("Label 2"), gbc);
...