【问题标题】:adding JLayeredPane to JPanel将 JLayeredPane 添加到 JPanel
【发布时间】:2010-12-18 08:36:34
【问题描述】:

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

【问题讨论】:

  • 不知道你在哪里以及如何将 MyClass 添加到某种框架中,就无法知道你哪里出错了。

标签: java jpanel jlayeredpane


【解决方案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(或任何其他组件)继承。你可以直接使用它而不必继承(除非你确实在创建一个新组件。

【讨论】:

  • 感谢您的回答!作为对左大括号评论的回应,ME 不这样做的原因是由于空白可读性。我觉得这是一个视觉设计问题,因为它没有性能影响。它对我有帮助,我知道它对不熟悉代码的其他人(不是全部)有帮助。
  • @asawilliams:确实它除了代码可读性之外没有其他影响。如果您已经意识到这种风格并且故意避免使用它,我认为没关系。无论如何,我为那些不知道它的人做推荐。我发现来自其他编程语言的开发人员拒绝采用这种风格。你以前有没有用其他花括号编程语言编程过?至于帮助,不客气;)
  • 是的,C、C++、C#、Actionscript 3、php、...。这正是我被教导的方式。我可以理解一些程序员喜欢编写紧凑的代码,但除了偏好之外,我看不出有任何其他理由这样做。
  • 看起来 JLayeredPane 似乎在 Swing/AWT 的正常布局和面板框架之外——这不是 StackOverflow 或更广泛世界网络上的孤立帖子......对 JLayeredPane 最适度的要求似乎是至少 100% 符合“填充”约束。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多