JFrame / BoxLayout странное поведение размера - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь правильно установить размеры моих JButtons в JPanel с BoxLayout, но поведение выходит за рамки странного. Он будет принимать высоту из JButton.setPreferredSize, но полностью игнорирует ширину. Это также работает только тогда, когда все кнопки установлены на одинаковую высоту. Как только один из них станет меньше, он вернет их все к некоторому случайному минимальному размеру (который даже не одинаков для всех кнопок)

Мой код такой:

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 500);

JPanel rightPanel = new JPanel();
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS));

JButton bBookmarks = new JButton("Bookmarks");
bBookmarks.setPreferredSize(new Dimension(200, 100));
//more buttons with same size

leftPanel.add(bBookmarks);
//more buttons

JSplitPane mainPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel);
mainPanel.setDividerLocation(200);

frame.add(mainPanel);
frame.setResizable(false);
frame.setVisible(true);

Это создает этот образ.

this image

Средняя кнопка всегда шире, чем остальные. Использование frame.pack () ничего не делает, кроме изменения размера фрейма, потому что правая панель пуста.

Что я делаю не так?

Редактировать: Должно выглядеть так:

1 Ответ

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

Разделяй и властвуй: разбей дизайн на маленькие, легко разрабатываемые контейнеры. В этом случае не размещайте кнопки непосредственно в левом (BoxLayout) контейнере, а во вложенном JPanel с помощью менеджера GridLayout. Это гарантирует, что все кнопки имеют одинаковый размер:

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);

    //add all buttons to a panel using a GridLayout which shows all components having the same size
    JPanel buttons = new JPanel(new GridLayout(0,1));
    JButton bBookmarks = new JButton("Bookmarks");  buttons.add(bBookmarks);
    JButton bPlotter = new JButton("Plotter");      buttons.add(bPlotter);
    JButton bShips = new JButton("Ships");          buttons.add(bShips);

    //add buttons and text area to a panel using BoxLayout
    JPanel leftPanel = new JPanel();
    leftPanel.setPreferredSize(new Dimension(100,400));
    leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS));
    leftPanel.add(buttons);
    leftPanel.add(new TextArea(10,30));

    JPanel rightPanel = new JPanel();
    rightPanel.setPreferredSize(new Dimension(600,400));
    rightPanel.add(new JLabel("right pane"));

    JSplitPane mainPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true, leftPanel, rightPanel);

    frame.add(mainPanel);
    frame.pack();
    frame.setVisible(true);

enter image description here

...