Java BorderLayout:如何设置组件的首选大小
Java BorderLayout: How to set Preferred size of components
我有一个包含两个面板的框架,一个名为 ScreenPanel,一个名为 MenuPanel,两者都有边框布局管理器。 ScreenPanel 是 JFrame 的内容面板。菜单面板位于屏幕面板的西侧。但是,当我运行时,MenuPanel的宽度太小,我尝试添加setSize();到 MainPanel 及其所有组件,但这没有用,有没有办法可以在 BorderLayout 中设置 MenuPanel 的大小?
菜单面板:
DefaultListModel<String> MenuModel = new DefaultListModel<>();
JList<String> MenuList = new JList<>(MenuModel);
JLabel MenuLabel = new JLabel();
MenuPanel(){
setBackground(new Color(0,168,243));
setLayout(new BorderLayout());
MenuList.setBackground(new Color(0,200,250));
MenuList.setForeground(new Color(80,80,80));
MenuList.setFont(new Font("Arial",Font.BOLD,20));
MenuModel.addElement("Page 1");
MenuModel.addElement("Page 2");
MenuModel.addElement("Page 3");
MenuModel.addElement("Page 4");
MenuModel.addElement("Page 5");
MenuLabel.setText("Menu");
MenuLabel.setFont(new Font("Arial",Font.BOLD,50));
MenuLabel.setForeground(new Color(50,50,50));
add(MenuList,BorderLayout.CENTER);
add(MenuLabel,BorderLayout.NORTH);
屏幕面板:
public class ScreenPanel extends JPanel{
ScreenPanel(){
setLayout(new BorderLayout());
setBackground(new Color(230,230,230));
add(new MenuPanel(),BorderLayout.WEST);
}
}
帧数:
public class ScreenFrame extends JFrame{
ScreenFrame(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(Frame.MAXIMIZED_BOTH);
setContentPane(new ScreenPanel());
setTitle("Random Project");
}
}
主要方法:
public class Main {
public static void main(String[] args) {
ScreenFrame screen = new ScreenFrame();
screen.pack();
screen.setVisible(true);
}
}
期望:
现实:
首先,变量名不应该以大写字符开头。学习并遵守 Java 约定。
I tried adding setSize()
不要尝试玩弄尺寸。布局管理器负责确定每个组件的大小和位置。
您也不应尝试“设置”组件的首选大小。所有 Swing 组件根据组件的属性确定自己的首选大小。
您可以通过更改组件的属性来影响组件的首选尺寸计算。
对于您可以使用的所有组件:
setFont(..)
- 使文本变大setBorder( new EmptyBorder(...) )
- 在 4 个边界周围提供额外的 space。可以为单个组件设置边框,也可以在 JPanel 上为添加到面板的所有组件设置边框。
此外,对于 JList,您可以使用:
setPrototypeCellValue( "Page 0000" )
- 根据您指定的文本计算更大的首选宽度
阅读 API 您可能会发现可以更改的其他属性。
JList 不是您正在做的事情的正确控件。 JList 用于可变数量的数据项,并且始终应该放置在 JScrollPane 中。
您可能需要一组 JButton,放置在使用 GridLayout 配置为只有一列的 JPanel 中。 GridLayout 将强制其所有子项都足够大以填充其相应的容器。
MenuPanel() {
setBackground(new Color(0,168,243));
setLayout(new BorderLayout());
JPanel menuList = new JPanel(new GridLayout(0, 1));
menuList.setBackground(new Color(0,200,250));
menuList.setForeground(new Color(80,80,80));
Font menuFont = new Font("Arial",Font.BOLD,20);
JButton menuButton;
menuButton = new JButton("Page 1");
menuButton.setHorizontalAlignment(SwingConstants.LEADING);
menuButton.setFont(menuFont);
menuButton.setBorderPainted(false);
menuButton.setContentAreaFilled(false);
menuList.add(menuButton);
menuButton = new JButton("Page 2");
menuButton.setHorizontalAlignment(SwingConstants.LEADING);
menuButton.setFont(menuFont);
menuButton.setBorderPainted(false);
menuButton.setContentAreaFilled(false);
menuList.add(menuButton);
menuButton = new JButton("Page 3");
menuButton.setHorizontalAlignment(SwingConstants.LEADING);
menuButton.setFont(menuFont);
menuButton.setBorderPainted(false);
menuButton.setContentAreaFilled(false);
menuList.add(menuButton);
menuButton = new JButton("Page 4");
menuButton.setHorizontalAlignment(SwingConstants.LEADING);
menuButton.setFont(menuFont);
menuButton.setBorderPainted(false);
menuButton.setContentAreaFilled(false);
menuList.add(menuButton);
menuButton = new JButton("Page 5");
menuButton.setHorizontalAlignment(SwingConstants.LEADING);
menuButton.setFont(menuFont);
menuButton.setBorderPainted(false);
menuButton.setContentAreaFilled(false);
menuList.add(menuButton);
JLabel menuLabel = new JLabel();
menuLabel.setText("Menu");
menuLabel.setHorizontalAlignment(SwingConstants.LEADING);
menuLabel.setFont(new Font("Arial",Font.BOLD,50));
menuLabel.setForeground(new Color(50,50,50));
menuLabel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 48));
add(menuList, BorderLayout.CENTER);
add(menuLabel, BorderLayout.NORTH);
}
当然,使用循环可以让上面的代码短很多:
MenuPanel() {
setBackground(new Color(0,168,243));
setLayout(new BorderLayout());
JPanel menuList = new JPanel(new GridLayout(0, 1));
menuList.setBackground(new Color(0,200,250));
menuList.setForeground(new Color(80,80,80));
Font menuFont = new Font("Arial",Font.BOLD,20);
String[] pageLabels = {
"Page 1", "Page 2", "Page 3", "Page 4", "Page 5",
};
JButton menuButton;
for (String pageLabel : pageLabels) {
menuButton = new JButton(pageLabel);
menuButton.setHorizontalAlignment(SwingConstants.LEADING);
menuButton.setFont(menuFont);
menuButton.setBorderPainted(false);
menuButton.setContentAreaFilled(false);
menuList.add(menuButton);
}
JLabel menuLabel = new JLabel();
menuLabel.setText("Menu");
menuLabel.setHorizontalAlignment(SwingConstants.LEADING);
menuLabel.setFont(new Font("Arial",Font.BOLD,50));
menuLabel.setForeground(new Color(50,50,50));
menuLabel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 48));
add(menuList, BorderLayout.CENTER);
add(menuLabel, BorderLayout.NORTH);
}
如果您的按钮标签确实是第 1 页到第 5 页,您可以只使用数字循环:
MenuPanel() {
setBackground(new Color(0,168,243));
setLayout(new BorderLayout());
JPanel menuList = new JPanel(new GridLayout(0, 1));
menuList.setBackground(new Color(0,200,250));
menuList.setForeground(new Color(80,80,80));
Font menuFont = new Font("Arial",Font.BOLD,20);
JButton menuButton;
for (int i = 1; i <= 5; i++) {
menuButton = new JButton("Page " + i);
menuButton.setHorizontalAlignment(SwingConstants.LEADING);
menuButton.setFont(menuFont);
menuButton.setBorderPainted(false);
menuButton.setContentAreaFilled(false);
menuList.add(menuButton);
}
JLabel menuLabel = new JLabel();
menuLabel.setText("Menu");
menuLabel.setHorizontalAlignment(SwingConstants.LEADING);
menuLabel.setFont(new Font("Arial",Font.BOLD,50));
menuLabel.setForeground(new Color(50,50,50));
menuLabel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 48));
add(menuList, BorderLayout.CENTER);
add(menuLabel, BorderLayout.NORTH);
}
请注意,在 Java 中,变量名称始终以小写字母开头(除非它们是静态最终字段,在这种情况下,名称应在 ALL_CAPS 中)。