Java JFrame/BoxLayout奇怪的大小行为

Java JFrame/BoxLayout奇怪的大小行为,java,swing,layout-manager,jsplitpane,Java,Swing,Layout Manager,Jsplitpane,我试图在带有BoxLayout的JPanel中正确设置我的JButtons的大小,但是这种行为是非常奇怪的。 它将采用JButton.setPreferredSize的高度,但完全忽略宽度。这也仅在所有按钮都设置为相同高度时有效。一旦一个按钮变小,它就会将所有按钮还原为某个随机的最小大小(甚至不是所有按钮都相同) 我的代码是: JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr

我试图在带有BoxLayout的JPanel中正确设置我的JButtons的大小,但是这种行为是非常奇怪的。 它将采用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);
这将创建此图像

中间的按钮也总是比其他按钮宽。使用frame.pack()除了调整帧的大小外,什么都不做,因为右侧面板是空的

我做错了什么

编辑:应如下所示:


分而治之:将设计分解为易于布局的小容器。在这种情况下,不要直接将按钮放置在左侧(
BoxLayout
)容器中,而是使用
GridLayout
管理器将按钮放置在嵌套的
JPanel
中。
这可确保所有按钮的大小相同:

    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);


如果希望所有按钮大小相同,请使用JPanel,使用
新网格布局(1,0)
来固定按钮。如果需要,您可以始终将该JPanel包装在使用BoxLayout的JPanel中同一面板中具有不同大小的按钮下方应有一个单独的JLabel。然后,容纳按钮的JPanel和JLabel进入另一个使用不同布局的JPanel,可能是BoxLayout,但关键是嵌套JPanels您可能希望发布所需GUI外观的图像添加图像作为Edits仍然存在调整大小的问题。不幸的是,我无法使按钮以适当的大小显示。建议的布局显示所有具有相同大小的按钮。如果希望左窗格具有特定宽度,请添加首选尺寸。请参阅我的编辑。