将JLayeredPane添加到JPanel

11

我正在尝试将 JLayeredPane 添加到 JPanel 上,然后将图像(JLabel 图标)和按钮添加到 JLayeredPane 上,但两者都没有显示出来。我已经测试过不使用按钮和 layeredpane 的图像,所以我知道它有效。这是我正在使用的一些代码。我是否遗漏了什么或做错了什么?


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
如果不知道你是如何将MyClass添加到某个框架中的,就无法确定你出了什么问题。 - Jonathan Feinberg
2个回答

17

来自教程

默认情况下,图层面板没有布局管理器。这意味着通常需要编写代码来定位和调整放置在图层面板中的组件。

查看您代码的更改:

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
感谢您的回答!关于大括号的问题,我没有采用那种方式的原因是为了保持代码的可读性。我认为这是一个视觉设计问题,因为它对性能没有影响。这有助于我,也有助于其他不熟悉代码的人(并非所有人)。 - asawilliams
@asawilliams:实际上它除了代码可读性外没有其他影响。如果你已经意识到这种风格并且故意避免使用它,我认为这是可以的。不过,我还是会向那些不知道的人推荐这种风格。我发现,从其他编程语言转来的开发人员往往抵制采用这种风格。顺便问一下,你以前有在其他花括号编程语言中编程吗?至于帮助,不用谢 ;) - OscarRyz
是的,C,C ++,C#,Actionscript 3,php,...这就是我学习的方式。我可以理解一些程序员喜欢有紧凑的代码,但我认为除了个人偏好之外,没有其他理由去这样做。 - asawilliams
似乎JLayeredPane在Swing/AWT的普通布局和面板框架之外 - 这不是StackOverflow或更广泛的网络世界上孤立的帖子... JLayeredPane上最谦虚的要求似乎至少是它像"fill"限制一样100%适合。 - will

4

JLayeredPane默认没有布局管理器,所以在你的示例中,你需要设置子组件的位置和大小。你可以在JLayeredPane上设置布局管理器,但这很可能会否定你想要的分层渲染,因为你正在使用分层窗格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接