2014-12-13 113 views
0

我想将多个面板添加到另一个面板。我希望他们互相顶点,所以我使用JLayeredPane。我为每个人添加了一个按钮。工作时应该出现两个按钮。使用JLayeredPane将多个JPanel添加到JPanel

import java.awt.Color; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class PanelTest { 
public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JPanel mainPanel = new JPanel(); 
    JPanel panel1 = new JPanel(); 
    JPanel panel2 = new JPanel(); 

    JLayeredPane layers = new JLayeredPane(); 
    mainPanel.add(layers); 

    panel2.setOpaque(false); 
    panel1.setOpaque(false); 
    panel1.setVisible(true); 
    panel2.setVisible(true); 

    panel1.add(new JButton("1111111111")); 
    panel2.add(new JButton("2")); 

    frame.setContentPane(mainPanel); 
    layers.add(panel1, new Integer(2)); 
    layers.add(panel2, new Integer(3)); 

    frame.setVisible(true); 
    frame.setSize(500, 500); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
} 

只有mainPanel的灰色背景可见。我究竟做错了什么?

回答

4

将组件添加到JLayeredPane时,实质上是使用容器将组件添加到空布局。这意味着您必须完全指定组件的大小和位置,通常通过拨打setBounds(...)来解决这两个问题。仍然

设定界限并没有任何区别

设定尺寸(范围)是必需的,但你:调用此上PANEL1和是Panel2,例如:

panel1.setBounds(10, 10, 100, 100); 
panel2.setBounds(70, 70, 100, 100); 

编辑有一个额外的问题。

您正在将JLayeredPane添加到使用FlowLayout的JPanel。默认情况下,FlowLayout尊重添加到其中的组件的首选大小。由于JLayeredPane使用空布局,所以它的首选大小是(0,0),所以没有东西可以绘制。

两个解决方案:

  1. 你并不需要JPanel中,只需使用:frame.setContentPane(layers);
  2. 如果你真的想使用的面板,那么你需要改变布局管理器:JPanel mainPanel = new JPanel(new BorderLayout());
+1

感谢您的信息,但设置界限没有任何区别。 – WVrock 2014-12-13 14:42:16

+3

1+,希望你不介意编辑皮特:)认为最好将完整的解决方案保存在一个答案中。 @WVrock,看看编辑。 – camickr 2014-12-13 16:35:51

+0

@camickr谢谢。它既适用于SSCCE,也适用于真正的计划。 mainPanel是必要的,因为我在cardLayout中使用它。 – WVrock 2014-12-13 17:43:39