Использование JLayeredPane для добавления нескольких JPanel в JPanel

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

import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class PanelTest {
public static void main(String[] args) {
    JFrame frame = new JFrame();
    JPanel mainPanel = new JPanel();
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();

    JLayeredPane layers = new JLayeredPane();
    mainPanel.add(layers);

    panel2.setOpaque(false);
    panel1.setOpaque(false);
    panel1.setVisible(true);
    panel2.setVisible(true);

    panel1.add(new JButton("1111111111"));
    panel2.add(new JButton("2"));

    frame.setContentPane(mainPanel);
    layers.add(panel1, new Integer(2));
    layers.add(panel2, new Integer(3));

    frame.setVisible(true);
    frame.setSize(500, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Виден только серый фон главной панели. Что я делаю неправильно?

1 ответ

Решение

При добавлении компонента в JLayeredPane, вы по существу добавляете компонент к нулевому макету, используя контейнер. Это означает, что вы должны полностью указать как размер компонента, так и его положение, часто решая как setBounds(...) вызов. Вызовите это на panel1 и panel2, например:

panel1.setBounds(10, 10, 100, 100);
panel2.setBounds(70, 70, 100, 100);

Редактировать:

установление границ не имеет никакого значения

Установка размера (в границах) обязательна, но у вас все еще есть дополнительная проблема.

Вы добавляете JLayeredPane в JPanel, которая использует FlowLayout. По умолчанию FlowLayout учитывает предпочтительный размер добавляемого к нему компонента. Поскольку JLayeredPane использует пустой макет, его предпочтительный размер (0, 0), поэтому рисовать нечего.

Два решения:

  1. Вам не нужен JPanel, просто используйте: frame.setContentPane(layers);
  2. Если вы действительно хотите использовать панель, вам нужно изменить менеджер раскладки: JPanel mainPanel = new JPanel( new BorderLayout());
Другие вопросы по тегам