JLabel 未显示在内部 JPanel 中

JLabel not showing in inner JPanel

为什么我的内部 JPanel 不显示我的 JLabel 文本?

我有一个外部 JPanel 和一个内部 JPanel,用于显示一些具有正确尺寸的文本。但是我不明白为什么它不显示?

                JPanel jp = new JPanel();
                jp.setBackground(Color.decode("#ffffff"));
                jp.setBounds(0, 35, 400, 315);

                JPanel mostInner = new JPanel();
                mostInner.setForeground(Color.black);
                mostInner.setBounds(207, 5, 190, 240);
                jp.add(mostInner);

                JLabel jltxt = new JLabel();
                jltxt.setText("Test");

                mostInner.add(jltxt);

Hovercraft Full Of Eels, you can help us to help you by adding a small program to your question that shows your problem (see https://whosebug.com/help/mcve 所述,以获取更多信息)。然后人们可以尝试重现并解决问题。

当我自己创建一个小程序时,它似乎运行良好:

import java.awt.*;
import javax.swing.*;

public class LabelNotVisible {
    public static void main(String[] arguments) {
        SwingUtilities.invokeLater(() -> new LabelNotVisible().createAndShowGui());
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame("Stack Overflow");
        frame.setBounds(100, 100, 800, 200);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel jp = new JPanel();
        jp.setBackground(Color.decode("#ffffff"));
        //jp.setBounds(0, 35, 400, 315);

        JPanel mostInner = new JPanel();
        mostInner.setForeground(Color.black);
        //mostInner.setBounds(207, 5, 190, 240);
        jp.add(mostInner);

        JLabel jltxt = new JLabel();
        jltxt.setText("Test");

        mostInner.add(jltxt);

        frame.getContentPane().add(jp);
        frame.setVisible(true);
    }
}

同样,最好避免使用 null 布局和 setBounds(...)。虽然 null 布局和 setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,您在使用它们时 运行 就会遇到更严重的困难.它们不会在 GUI 调整大小时调整组件的大小,它们是皇家 来增强或维护的,当放置在滚动窗格中时它们完全失败,当在所有平台或屏幕分辨率上查看时它们看起来很糟糕和原来的不一样。

例如,以下代码创建此 GUI:

这使用 GridLayout 将一个 JPanel 放置在另一个 JPanel 的右侧。如果我想在不同的相对位置添加更多组件,只需嵌套 JPanel 即可轻松实现,每个 JPanel 使用自己的布局。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.*;

public class WorkWithLayouts extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final int PREF_W = 400;
    private static final int PREF_H = 315;
    private static final String BG = "#ffffff";

    public WorkWithLayouts() {
        JPanel mostInner = new JPanel();
        mostInner.setForeground(Color.black);
        mostInner.setOpaque(false); // if you want the backing jpanel's background to show through

        // add title temporarily just to show where mostInner panel is
        mostInner.setBorder(BorderFactory.createTitledBorder("most inner")); // TODO: delete this

        JLabel jltxt = new JLabel();
        jltxt.setText("Test");
        mostInner.add(jltxt);

        setBackground(Color.decode(BG));
        setLayout(new GridLayout(1, 2));
        add(new JLabel()); // empty label
        add(mostInner);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        } else {
            return new Dimension(PREF_W, PREF_H);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }

    private static void createAndShowGui() {
        WorkWithLayouts mainPanel = new WorkWithLayouts();
        JFrame frame = new JFrame("Work With Layouts");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}