JLabel не отображается во внутренней 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);

2 ответа

Решение

Как уже упоминалось в Hovercraft Full Of Eels, вы можете помочь нам, добавив небольшую программу к вашему вопросу, которая показывает вашу проблему (см. https://stackru.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 может показаться, что это самый простой и лучший способ создания сложных графических интерфейсов. Чем больше у вас Swing 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);
    }
}
Другие вопросы по тегам