Java JFrame/BoxLayout奇怪的大小行为
我试图在带有BoxLayout的JPanel中正确设置我的JButtons的大小,但是这种行为是非常奇怪的。 它将采用JButton.setPreferredSize的高度,但完全忽略宽度。这也仅在所有按钮都设置为相同高度时有效。一旦一个按钮变小,它就会将所有按钮还原为某个随机的最小大小(甚至不是所有按钮都相同) 我的代码是: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
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仍然存在调整大小的问题。不幸的是,我无法使按钮以适当的大小显示。建议的布局显示所有具有相同大小的按钮。如果希望左窗格具有特定宽度,请添加首选尺寸。请参阅我的编辑。