Сетка GridBagConstraints неожиданно влияет на компоненты

1

Это результат, который я собираюсь сделать: Изображение 174551

Но это то, что я получаю: Изображение 174551

Теперь я понимаю GridBagConstraints.HORIZONTAL; позволяет компоненту занимать любое пустое пространство по горизонтали, но я не уверен, как бы компонент заполнил оставшуюся часть пространства сетки. Вот мой текущий код GUI, включая GridBagConstraints:

public class LoginPanel extends JPanel {
    private JTextField userfield;
    private JPasswordField passfield;

    private JButton login;
    private JButton create;

    public LoginPanel() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = .2;

        gbc.anchor = GridBagConstraints.EAST;
        JLabel label = new JLabel("Username: ");
        gbc.gridx = 1;
        add(label, gbc);

        label = new JLabel("Password: ");
        gbc.gridy = 1;
        add(label, gbc);

        gbc.anchor = GridBagConstraints.WEST;
        userfield = new JTextField(10);
        gbc.gridx = 2;
        gbc.gridy = 0;
        add(userfield, gbc);

        passfield = new JPasswordField(10);
        gbc.gridy = 1;
        add(passfield, gbc);


        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.CENTER;
        login = new JButton("Login");
        gbc.gridwidth = 2;
        gbc.gridx = 1;
        gbc.gridy = 2;
        add(login, gbc);

        create = new JButton("Create Account");
        gbc.gridy = 3;
        add(create, gbc);


        JTextPane textpane = new JTextPane();
        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.gridwidth = 10;
        add(textpane, gbc);
    }
}

Есть ли способ добиться такого форматирования с помощью GridBagLayout? Если нет, то какие макеты/макеты вы рекомендуете использовать?

Если вы все еще запутались в своих целях, я пытаюсь, чтобы кнопки заполняли достаточно места, чтобы быть даже с метками и полями, но моя текстовая панель внизу заполняет весь экран.

Теги:
swing
layout-manager
gridbaglayout

1 ответ

1
Лучший ответ

Избавьтесь от линии

gbc.weightx = .2;

Он возится с свойствами fill...

Изображение 174551

Обновлено, пропущено одно требование

Хорошо, вы могли потратить всю оставшуюся жизнь, пытаясь сделать эту работу, или вы можете разбить макет на управляемые части и разложить их отдельно...

Изображение 174551

Этот пример в основном помещает поля и кнопки в собственный контейнер и фокусируется на их требованиях к макету. Затем он добавляет это и текстовое поле в LoginPane и отдельно LoginPane свои требования...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class TestLayout100 {

    public static void main(String[] args) {
        new TestLayout100();
    }

    public TestLayout100() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new LoginPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class LoginPanel extends JPanel {

        private JTextField userfield;
        private JPasswordField passfield;

        private JButton login;
        private JButton create;

        public LoginPanel() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            JPanel fields = new JPanel(new GridBagLayout());

            gbc.anchor = GridBagConstraints.EAST;
            JLabel label = new JLabel("Username: ");
            gbc.gridx = 1;
            fields.add(label, gbc);

            label = new JLabel("Password: ");
            gbc.gridy = 1;
            fields.add(label, gbc);

            gbc.anchor = GridBagConstraints.WEST;
            userfield = new JTextField(10);
            gbc.gridx = 2;
            gbc.gridy = 0;
            fields.add(userfield, gbc);

            passfield = new JPasswordField(10);
            gbc.gridy = 1;
            fields.add(passfield, gbc);

            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.anchor = GridBagConstraints.CENTER;
            login = new JButton("Login");
            gbc.gridwidth = 2;
            gbc.gridx = 1;
            gbc.gridy = 2;
            fields.add(login, gbc);

            create = new JButton("Create Account");
            gbc.gridy = 3;
            fields.add(create, gbc);

            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            add(fields, gbc);

            JTextPane textpane = new JTextPane();
            gbc.weightx = 1;
            gbc.gridy++;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(textpane, gbc);
        }
    }

}
  • 0
    Но это не позволяет JTextPane заполнить всю панель
  • 0
    Извините, не обращал внимания ... держись
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню