Java Swing JLayeredPane не отображается

Кажется, у меня есть некоторые серьезные проблемы с JLayeredPane, у меня есть BorderLayout() панели, и я бы хотел, чтобы элемент на западной стороне содержал несколько JLayeredPane друг над другом, чтобы я мог переключаться между ними, чтобы показать нужную информацию.

Западная панель должна иметь ширину 200 пикселей и иметь длину всего окна. В моем примере кода я добавил два слоя к JLayeredPanel, но они не появляются. Они должны быть на западной панели.

Вот мой код:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Main {
    private static JFrame mainFrame = new JFrame();
    private static JPanel mainPane = new JPanel();
    public Main(){}

    public static void initGui(){
        JLayeredPane westPanel = new JLayeredPane();
        westPanel.setPreferredSize(new Dimension(200,0));
        westPanel.setBackground(Color.blue);

        JPanel layerOne = new JPanel();
        layerOne.add(new JLabel("This is layer 1"));
        westPanel.add(layerOne, new Integer(0), 0);

        JPanel layerTwo = new JPanel();
        layerTwo.add(new JLabel("This si layer 2"));
        westPanel.add(layerTwo, new Integer(1), 0);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.yellow);

        JPanel eastPanel = new JPanel();
        eastPanel.setPreferredSize(new Dimension(200,0));
        eastPanel.setBackground(Color.red);

        mainPane = new JPanel(new BorderLayout());
        mainPane.add(westPanel, BorderLayout.WEST);
        mainPane.add(centerPanel, BorderLayout.CENTER);
        mainPane.add(eastPanel, BorderLayout.EAST);

        mainFrame = new JFrame("Learning to use JLayeredPane");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setBounds(200, 200, 800, 500);
        mainFrame.setContentPane(mainPane);
        mainFrame.setVisible(true);
    }

    public static void main(String[] args) {
        initGui();
    }
}

Что это приводит к:

2 ответа

Решение

JLayeredPane использует пустой макет, поэтому вы несете ответственность за указание размера и расположения всех добавляемых в него компонентов. Если нет, они по умолчанию будут иметь местоположение [0, 0] и размер [0, 0].

Попробуйте это, это работает

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Main {
    private static JFrame mainFrame = new JFrame();
    private static JPanel mainPane = new JPanel();
    public Main(){}

    public static void initGui(){
        JLayeredPane westPanel = new JLayeredPane();
        westPanel.setLayout(null);
        westPanel.setPreferredSize(new Dimension(200,0));
        westPanel.setBackground(Color.blue);

        JPanel layerOne = new JPanel();
        layerOne.add(new JLabel("This is layer 1"));
        layerOne.setBounds(0, 0, 100, 100);
        westPanel.add(layerOne, new Integer(0), 0);

        JPanel layerTwo = new JPanel();
        layerTwo.add(new JLabel("This si layer 2"));
        layerTwo.setBounds(0, 100, 100, 100);
        westPanel.add(layerTwo, new Integer(1), 0);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.yellow);

        JPanel eastPanel = new JPanel();
        eastPanel.setPreferredSize(new Dimension(200,0));
        eastPanel.setBackground(Color.red);

        mainPane = new JPanel();
        mainPane.setLayout(new BorderLayout());
        mainPane.add(westPanel, BorderLayout.WEST);
        mainPane.add(centerPanel, BorderLayout.CENTER);
        mainPane.add(eastPanel, BorderLayout.EAST);

        mainFrame = new JFrame("Learning to use JLayeredPane");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setBounds(200, 200, 800, 500);
        mainFrame.setContentPane(mainPane);
        mainFrame.setVisible(true);
    }

    public static void main(String[] args) {
        initGui();
    }
}
Другие вопросы по тегам