猿问

具有空布局的 JPanel 类不显示组件

因此,我创建了一个“CustomPanel”类的对象,该对象创建一个带有 GridLayout 的 JPanel 和其中的标签,然后将其添加到我的 JFrame 中。它可以很好地显示标签“HELLO”,但是当我将 jpanel 的布局管理器更改为 (null) 时,它不会显示任何内容。我知道,我知道使用空布局是一种非常糟糕的做法,但我只想知道为什么它不显示组件。


主要类别:


import javax.swing.JFrame;


public class MainMenu extends javax.swing.JFrame{


    private static void createAndShowGUI() {

        //Create and set up the window.

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        //Size the window.

        frame.setSize(500, 500);


        CustomPanel panel = new CustomPanel();


        frame.getContentPane().add(panel);


        frame.setVisible(true);

    }


    public static void main(String[] args) {


        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                createAndShowGUI();

            }

        });

    }

}

带有 GridLayout 的 CustomPanel 类(效果很好):


import java.awt.GridLayout;

import javax.swing.JLabel;

import javax.swing.JPanel;


public class CustomPanel extends JPanel{


    public CustomPanel() {

        initUI();

    }


    public final void initUI() {


        // create the panel and set the layout

        JPanel main = new JPanel();

        main.setLayout(new GridLayout());


        // create the labels

        JLabel myLabel = new JLabel("HELLO");


        // add componets to panel

        main.add(myLabel);


        this.add(main);

    }

}

具有空布局的 CustomPanel 类(这不起作用):


import javax.swing.JLabel;

import javax.swing.JPanel;


public class CustomPanel extends JPanel{


    public CustomPanel() {

        initUI();

    }


    public final void initUI() {


        // create the panel and set the layout

        JPanel main = new JPanel();

        main.setLayout(null);


        // create the labels

        JLabel myLabel = new JLabel("HELLO");

        myLabel.setBounds(10, 10, myLabel.getPreferredSize().width, myLabel.getPreferredSize().height);


        // add componets to panel

        main.add(myLabel);


        this.add(main);

    }

}

jlabel 在 jpanel 内正确设置,因此它应该显示在 jframe 的左上角,但事实并非如此。是什么原因造成的?我错过了什么?


慕桂英4014372
浏览 137回答 1
1回答

摇曳的蔷薇

问题是,当您不使用正确的布局管理器时,主 JPanel 的首选大小为 0,0,并且不会在其所在的容器内显示。保存主 JPanel 的 CustomPanel 使用 FlowLayout 并将使用其包含的组件的首选大小来帮助调整这些组件的大小和位置,但由于 main 没有布局,因此将 JLabel 添加到 main 不会增加首选大小,因为它应该是 - 另一个使用布局的原因,CustomPanel 会将 main 显示为一个无大小的点。您当然可以通过给 main 一个首选大小来解决这个问题main.setPreferredSize(...),但是这样你就会用一个拼凑来解决一个拼凑——这不好。另一种可能的解决方案是将 CustomPanel 的布局更改为其他可能扩展它所包含的主 JPanel 的布局,也许为 CustomPanel 提供一个 BorderLayout。在这种情况下,以默认方式将 main 添加到 CustomPanel 会将主 JPanel 放置到 BorderLayout.CENTER 位置,将其展开以填充 CustomPanel,并且可能会看到 JLabel。当然,正确的解决方案是尽可能避免使用空布局。
随时随地看视频慕课网APP

相关分类

Java
我要回答