微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java BorderLayout:如何设置组件的首选大小

如何解决Java BorderLayout:如何设置组件的首选大小

我有一个包含两个面板的框架,一个名为ScreenPanel,一个名为MenuPanel,都具有边框布局管理器。 ScreenPanel是JFrame的内容面板。菜单面板位于ScreenPanel的WEST上。但是,当我运行时,MenuPanel的宽度太小,我尝试添加setSize();。到MainPanel及其所有组件,但是没有用,是否可以在BorderLayout中设置MenuPanel的大小?

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",50));
    MenuLabel.setForeground(new Color(50,50,50));

    add(MenuList,BorderLayout.CENTER);
    add(MenuLabel,BorderLayout.norTH);

ScreenPanel:

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

期望:

enter image description here

现实:

enter image description here

解决方法

首先,变量名称不应以大写字母开头。学习并遵循Java约定。

我尝试添加setSize()

不要尝试播放尺寸。布局管理器负责确定每个组件的大小和位置。

您也不应尝试“设置”组件的首选大小。所有Swing组件都根据组件的属性确定自己的首选大小。

您可以通过更改组件的属性来影响首选的组件尺寸计算。

对于所有组件,您都可以使用:

  1. setFont(..)-使文本变大
  2. setBorder( new EmptyBorder(...) )-在4个边界周围留出额外的空间。可以为单个组件设置边框,也可以在JPanel上为添加到面板的所有组件设置边框。

此外,对于JList,您可以使用:

  1. setPrototypeCellValue( "Page 0000" )-根据您指定的文本计算更大的首选宽度

阅读API,您可能会发现其他可以更改的属性。

,

JList不适用于您正在执行的操作。 JList用于可变数量的数据项,并且始终应该放置在JScrollPane中。

您可能希望将一组JButton放置在JPanel中,该JPanel使用GridLayout配置为仅包含一列。 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",50));
    menuLabel.setForeground(new Color(50,50,50));
    menuLabel.setBorder(BorderFactory.createEmptyBorder(12,12,48));

    add(menuList,BorderLayout.CENTER);
    add(menuLabel,BorderLayout.NORTH);
}

当然,使用循环可以使上面的代码更短:

MenuPanel() {
    setBackground(new Color(0,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",BorderLayout.NORTH);
}

如果按钮标签确实是第1页到第5页,则可以使用数字循环:

MenuPanel() {
    setBackground(new Color(0,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",BorderLayout.NORTH);
}

请注意,在Java中,变量名称始终以小写字母开头(除非它们是静态的final字段,在这种情况下,名称应为ALL_CAPS)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。