Добавление JLayeredPane в JPanel

Я пытаюсь добавить JLayeredPane в JPanel, а затем добавить изображение (значок JLabel) и кнопку в JLayeredPane, но не появиться. Я тестировал изображение без кнопки и слоистой панели, поэтому я знаю, что это работает. Вот некоторые из кода, который я использую. Есть ли что-то, что я пропускаю или делаю неправильно?


public class MyClass extends JPanel 
{
    private JLayeredPane layeredPane;
    private JLabel imageContainer = new JLabel();
    private JButton info = new JButton("i");

    MyClass(ImageIcon image)
    {
        super();

        this.imageContainer.setIcon(image);

        this.layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(300, 300));
        layeredPane.add(imageContainer, new Integer(50));
        layeredPane.add(info, new Integer(100));

        this.add(layeredPane);
    }
}       

Ответ 1

Из tutorial

По умолчанию многоуровневая панель не имеет менеджера компоновки. Это означает, что вам обычно приходится писать код, который позиционирует и определяет размеры компонентов, которые вы помещаете в слоистую панель.

См. изменения в коде:

import java.awt.*;
import javax.swing.*;
public class MyClass extends JPanel {
    private JLayeredPane layeredPane;
    private JLabel imageContainer = new JLabel();
    private JButton info = new JButton("i");

    MyClass(ImageIcon image) {
        super();

        this.imageContainer.setIcon(image);

        this.layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(300, 300));
        layeredPane.add(imageContainer, new Integer(50));
        layeredPane.add(info, new Integer(100));
        this.add(layeredPane);
        // CHANGED CODE
        // Manually set layout the components. 
        imageContainer.setBounds( 0, 0,  
                                  image.getIconWidth(),
                                  image.getIconHeight() ); 
        info.setBounds( 200, 00,  50, 40 );
    }
    public static void main( String [] args ) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( new MyClass( new ImageIcon("logo.png")  ) );
        frame.pack();
        frame.setVisible( true );
    }
}       

Дополнительные примечания:

1) Лучше (на мой взгляд) поместить открытую фигурку в ту же линию. Это похоже на то, как выглядит большинство Java-кода.

2) Избегайте наследования от JPanel (или любого другого компонента), если вы не создаете подкласс. Вы можете использовать его напрямую, не наследуя (если вы действительно не создаете новый компонент.

Ответ 2

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