GridBagLayout Ограничения не соблюдаются, если к одному из JPanel добавлен Контент - PullRequest
0 голосов
/ 17 марта 2019

Попытка выяснить, как сохранить соотношение размеров между этими двумя панелями 3: 1.

Как выглядит, когда я просто добавляю два JPanels в GridBagLayout с правильными ограничениями:

https://i.stack.imgur.com/v6TLR.png

И вот как выглядит код:

class MainPanel extends JPanel {

    MainPanel() {

        setLayout(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.gridwidth = GridBagConstraints.RELATIVE;
        constraints.gridheight = GridBagConstraints.REMAINDER;
        constraints.weightx = 3;
        constraints.weighty = 1;
        constraints.fill = GridBagConstraints.BOTH;
        constraints.gridx = 0;
        constraints.gridy = 0;
        JPanel pane1 = new JPanel();
        pane1.setBackground(Color.GRAY);
        add(pane1, constraints);

        constraints.gridwidth = GridBagConstraints.REMAINDER;
        constraints.gridx = 3;
        constraints.gridy = 0;
        constraints.weightx = 1;
        JPanel pane2 = new JPanel();
        pane2.setBackground(Color.DARK_GRAY);
        add(new RightPanel(), constraints);
    }
}

Но потом, как только я начинаю добавлять такие вещи, как JButtons или JLabels справаПанель, соотношение 3: 1 полностью забыто, и правая панель, кажется, занимает произвольное количество места, независимо от того, насколько маленькими я создаю объекты внутри нее.

Вот как это выглядит:

https://i.stack.imgur.com/njYnw.png

И вот как выглядит код:

class RightPanel extends JPanel {

    class ComboPanel extends JPanel {

        ComboPanel(String labelText) {
            JTextField textField = new JTextField();

            textField.setPreferredSize(new Dimension(80, 30));
            add(new JLabel(labelText));
            add(textField);

        }
    }

    RightPanel() {

        Box componentBox = Box.createVerticalBox();


        add(componentBox);

        JLabel currentPosX = new JLabel("Current X position: ( X )");
        currentPosX.setAlignmentX(Component.CENTER_ALIGNMENT);

        JLabel currentPosY = new JLabel("Current Y position: ( Y )");
        currentPosY.setAlignmentX(Component.CENTER_ALIGNMENT);

        Box positionBox = Box.createVerticalBox();

        positionBox.add(currentPosX);
        positionBox.add(Box.createRigidArea(new Dimension(0, 5)));
        positionBox.add(currentPosY);
        positionBox.add(Box.createRigidArea(new Dimension(0, 10)));
        positionBox.setBackground(Color.LIGHT_GRAY);
        positionBox.setOpaque(true);

        componentBox.add(positionBox);

        componentBox.add(Box.createRigidArea(new Dimension(0, 5)));

        ComboPanel comboPanelX = new ComboPanel("Target X Position: ");
        comboPanelX.setAlignmentX(Component.CENTER_ALIGNMENT);
        componentBox.add(comboPanelX);

        componentBox.add(Box.createRigidArea(new Dimension(0, 5)));

        ComboPanel comboPanelY = new ComboPanel("Target Y Position: ");
        comboPanelY.setAlignmentX(Component.CENTER_ALIGNMENT);
        componentBox.add(comboPanelY);

        componentBox.add(Box.createRigidArea(new Dimension(0, 5)));

        JButton commandButton = new JButton("Move");
        commandButton.setAlignmentX(Component.CENTER_ALIGNMENT);
        componentBox.add(commandButton);

    }
}

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

...