簡體   English   中英

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

同樣,最好避免使用null布局和setBounds(...) 盡管null布局和setBounds()似乎是Swing新手創建復雜GUI的最簡單和最佳方法,但您創建的Swing GUI越多,使用它們時就會遇到更大的困難。 當GUI調整大小時,它們不會重新調整組件的大小;它們是需要增強或維護的皇家女巫;放置在滾動窗格中時,它們會完全失敗;在所有平台或與屏幕分辨率不同的屏幕分辨率下,它們看起來都令人討厭。原來的一個。

例如,以下代碼創建此GUI:

簡單的GUI

這使用GridLayout將JPanel放置在另一個JPanel的右側。 如果我想在不同的相對位置添加更多組件,只需嵌套JPanels即可輕松實現,每個面板都使用自己的布局。

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

正如《 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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM