-1

为什么我的 Inner 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);
4

2 回答 2

2

同样,最好避免使用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);
    }
}
于 2015-12-27T19:33:23.840 回答
0

正如Hovercraft Full Of Eels已经提到的那样,您可以通过在您的问题中添加一个小程序来显示您的问题来帮助我们(有关更多信息,请参阅https://stackoverflow.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);
    }
}
于 2015-12-27T17:01:19.477 回答