2009-11-19 159 views
11

我想添加一个JLayeredPane到JPanel,然后添加一个图像(JLabel图标)和一个按钮到JLayeredPane,但都没有出现。我已经测试了没有按钮和分层面板的图像,所以我知道这很有用。这里是我使用的一些代码。有什么我失踪或做错了吗?将JLayeredPane添加到JPanel

 

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添加到某种框架中,因此没有告诉您出错的地方 – 2009-11-19 15:39:25

回答

15

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

谢谢你的回答!为了回应这个大括号的评论,我不这样做的原因是由于空白的可读性。我觉得这是一个视觉设计问题,因为它没有proformance影响。它帮助我和我知道它可以帮助那些不熟悉代码的其他人(不是全部) – asawilliams 2009-11-19 17:21:11

+0

@asawilliams:确实它没有其他影响,但代码可读性。如果你已经意识到这种风格,并且你有意避免它,我认为它是可以的。无论如何,我会为那些不知道它的人推荐这个建议,我发现来自其他编程语言的开发人员拒绝采用这种风格。在其他花括号编程语言之前?至于帮助,不用客气;) – OscarRyz 2009-11-19 17:57:09

+0

是啊,C,C++,C#,Actionscript 3,php,...。这正是我被教导的方式。我可以理解一些程序员喜欢使用紧密代码,但除了首选项之外,我没有看到任何其他原因。 – asawilliams 2009-11-19 18:06:04

4

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