将JLayeredPane添加到JPanel

时间:2009-11-19 15:31:16

标签: java jpanel jlayeredpane

我正在尝试将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);
    }
}       

2 个答案:

答案 0 :(得分:16)

来自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(或任何其他组件)。您可以直接使用它而无需继承(除非您确实在创建新组件。

答案 1 :(得分:4)

默认情况下,JLayeredPane具有空布局管理器,因此在您的示例中,您需要设置子组件的位置和大小。您可以在JLayeredPane上设置布局管理器,但这很可能会否定我猜测您想要的分层渲染,因为您正在使用分层窗格。