2012-06-19 51 views
2

我正在试用JLayeredPane。因此,在下面的代码中,我创建了一个JLayeredPane和一个JLabel。我将标签添加到分层窗格,我将其添加到JPanel。这个面板然后被添加到一个JFrame。现在获取Swing组件的合适尺寸

public static void main(String[] args) { 
     frame = new JFrame("LayeredPane Example"); 
     frame.setPreferredSize(new Dimension(500,500)); 
     layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(400, 400)); 
     JLabel label = new JLabel("Label on LayeredPane"); 
     label.setLocation(200, 200); 
     System.out.println("Width " + label.getWidth()); 
     label.setBounds(20, 20, 400, 40); 
     layeredPane.add(label); 
     layeredPane.setLayer(label, 10, 1); 
     frame.setLayout(new BorderLayout());   
     JPanel panel = new JPanel(); 
     panel.add(layeredPane); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

的问题是,如果我没有在声明label.setBounds(20, 20, 400, 40);,则标签不会出现在分层窗格。这引出了两个问题:

  1. 为什么setBounds如此重要?
  2. 可能是我以前的问题的一部分回答,标签在设置边界之前的初始高度和宽度为,这可能是因为setBounds很重要。在这种情况下,我想知道当我将它添加到JLayeredPane中时,如何确定Swing组件的适当边界。 (如果我的范围是小于组件的适当大小,组件会出现隐藏)

编辑: 的第一个问题是在更详细here早些时候回答。

回答

4

关于:

  1. 为什么setBounds如此重要:一个JLayeredPane的使用基本上是空的布局,每当你使用空布局,你的编码器是完全负责的尺寸和部件的位置时,两个你加。这只是这种布局的规则。
  2. 如何确定合适的界限:有一件事情我已经做了很简单,就是让组件告诉我它的首选大小是什么,然后用它来满足大小:

myJLabel.setSize(myJLabel.getPreferredSize());

另一件事我已经完成的是为我的JLayeredPane的每个层使用不透明的JPanel,给这些JPanel适当的布局,然后将我的组件添加到适当的层JPanel。然后,我使用一个侦听器来确保JPanel层的大小与其JLayeredPane容器的大小相匹配。