Компоненты Swing BoxLayout не располагаются - PullRequest
1 голос
/ 16 апреля 2020

Когда я использую FlowLayout, компоненты перемещаются в новую строку, когда достигают предела. Я хочу точно такой же, но Вертикальный. Проведя небольшое исследование, я обнаружил, что то, что я хочу сделать, должно быть выполнено sh с использованием BoxLayout. Но мой макет блока использует только один столбец.

enter image description here Я хочу, чтобы вторая панель обнаружила, что ее места недостаточно для отображения всех компонентов на главной панели и поместила ее в второй столбец.

Вот код для воспроизведения проблемы.

import javax.swing.*;

public class TestingMain {

    static JFrame frame;

    public static JPanel createUI() {
        JPanel UIPanel = new JPanel();
        UIPanel.setLayout(new BoxLayout(UIPanel, BoxLayout.Y_AXIS));

        JPanel firstPanel = new JPanel();
        JPanel secondPanel = new JPanel();

        firstPanel = new JPanel();
        firstPanel.setLayout(new BoxLayout(firstPanel, BoxLayout.Y_AXIS));
        firstPanel.setBorder(BorderFactory.createTitledBorder("Box 1"));

        JCheckBox ch1 = new JCheckBox("checkbox!");
        JCheckBox ch2 = new JCheckBox("checkbox!");
        JCheckBox ch3 = new JCheckBox("checkbox!");
        JCheckBox ch4 = new JCheckBox("checkbox!");
        JCheckBox ch5 = new JCheckBox("checkbox!");
        JCheckBox ch6 = new JCheckBox("checkbox!");
        JCheckBox ch7 = new JCheckBox("checkbox!");


        firstPanel.add(ch1);
        firstPanel.add(ch2);
        firstPanel.add(ch3);
        firstPanel.add(ch4);
        firstPanel.add(ch5);
        firstPanel.add(ch6);
        firstPanel.add(ch7);


        secondPanel.setBorder(BorderFactory.createTitledBorder("Box 2"));
        secondPanel.setLayout(new BoxLayout(secondPanel, BoxLayout.Y_AXIS));
        JCheckBox alarmLimitedBatt = new JCheckBox("checkbox!");
        JCheckBox alarmNotEnoughBatt = new JCheckBox("checkbox!");
        JCheckBox alarmLowBatt = new JCheckBox("checkbox!");
        JCheckBox alarmCriticalBatt = new JCheckBox("checkbox!");
        JCheckBox stateOfCharge = new JCheckBox("checkbox!");
        JCheckBox sleepState = new JCheckBox("checkbox!");

        secondPanel.add(alarmLimitedBatt);
        secondPanel.add(alarmNotEnoughBatt);
        secondPanel.add(alarmLowBatt);
        secondPanel.add(alarmCriticalBatt);
        secondPanel.add(stateOfCharge);
        secondPanel.add(sleepState);

        UIPanel.add(firstPanel);
        UIPanel.add(secondPanel);
        return  UIPanel;

    }

    private static void createAndShowGUI() {
        //Create and set up the window.
        frame = new JFrame("BoxLayout Issue");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JPanel newContentPane = createUI();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.setSize(800,250);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
...