2012-12-14 34 views
3

我有一个Jarame和一个JPanel,其中有一个带有ImageIcon()的JLabel。一切工作完美,问题是我现在想要添加另一个JPanel与所有其他东西像按钮等等的JFrame。但它仍然显示背景图像上方,而第二个JPanel则没有显示。一个框架中的多个JPanel /有一个支架图像和另一个顶层组件的图层

有人可以帮助我吗? 这里是我的代码的摘录:

JFrame window = new JFrame("Http Download"); 


/* 
* Background Section 
*/ 
JPanel panel1 = new JPanel(); 

JLabel lbl1 = new JLabel(); 


/* 
* Component Section 
*/ 
JPanel panel2 = new JPanel(); 

JLabel lbl2 = new JLabel(); 


/* 
* Dimension Section 
*/ 
Dimension windowSize = new Dimension(800, 600); 
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 

public HTTPDownloadGUI() { 

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    panel1.setLayout(null); 
    panel1.setSize(windowSize); 
    panel1.setOpaque(false); 

    panel2.setLayout(null); 
    panel2.setSize(windowSize); 
    panel2.setOpaque(false); 

    lbl1.setSize(windowSize); 
    lbl1.setLocation(0, 0); 
    lbl1.setIcon(new ImageIcon(getClass().getResource("bg1.png"))); 
    panel1.add(lbl1); 

    lbl2.setBounds(0, 0, 100, 100); 
    //lbl2.setIcon(new ImageIcon(getClass().getResource("bg2.png"))); 
    lbl2.setBackground(Color.GREEN); 
    panel2.add(lbl2); 

    panel1.add(panel2); 

    window.add(panel1); 

    int X = (screen.width/2) - (windowSize.width/2); 
    int Y = (screen.height/2) - (windowSize.height/2); 

    window.setBounds(X,Y , windowSize.width, windowSize.height); 
    window.setVisible(true); 

} 

回答

2
  1. 避免空的布局,这里比较麻烦那么他们是值得
  2. 设置框架布局BorderLayout
  3. 标签添加到帧
  4. 将标签布局设置为BorderLayout
  5. 创建面板并将其不透明属性设置为false
  6. 其它组分添加到按照正常
  7. 面板添加到标签

结帐

对于实施例

更新与例如

  • panel1为主要背景...
  • 设置panel1的布局BorderLayout
  • 添加lbl1panel1
  • 设置lbl1的布局BorderLayout
  • 套装panel2的布局,以至于你想用什么......
  • 设置panel2的不透明度属性falsepanel2.setOpacity(false)
  • 添加lbl2panel2
  • 添加panel2lbl1
  • 添加panel1到每一个你想要的。

enter image description here

public class TestLayout17 { 

    public static void main(String[] args) { 
     new TestLayout17(); 
    } 

    public TestLayout17() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     /* 
     * Background Section 
     */ 
     JPanel panel1 = new JPanel(); 
     JLabel lbl1 = new JLabel(); 
     /* 
     * Component Section 
     */ 
     JPanel panel2 = new JPanel(); 
     JLabel lbl2 = new JLabel(); 
     /* 
     * Dimension Section 
     */ 
     Dimension windowSize = new Dimension(800, 600); 
     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 

     public TestPane() { 

      setLayout(new BorderLayout()); 

      panel1.setLayout(new BorderLayout()); 

      lbl1.setLayout(new BorderLayout()); 
      URL url = getClass().getResource("/bg1.gif"); 
      System.out.println(url); 
      try { 
       BufferedImage image = ImageIO.read(url); 
       Image smaller = image.getScaledInstance(-1, image.getHeight()/2, Image.SCALE_SMOOTH); 
       lbl1.setIcon(new ImageIcon(smaller)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
//   lbl1.setIcon(new ImageIcon(url)); 
      panel1.add(lbl1); 

      add(panel1); 

      panel2.setLayout(new GridBagLayout()); 
      panel2.setOpaque(false); 

      lbl2.setBorder(new EmptyBorder(8, 8, 8, 8)); 
      lbl2.setBackground(Color.GREEN); 
      lbl2.setText("Say hello");; 
      lbl2.setOpaque(true); 
      panel2.add(lbl2); 

      lbl1.add(panel2); 

     } 
    } 
} 
+0

哪些标签,以及哪个框架和哪个面板是您的意思?你可以尝试多解释一下吗? – user1905203

+0

更新了例子... – MadProgrammer

+0

太棒了,它完美的作品。我的错误是,我将panel2添加到panel1而不是label1。感谢兄弟们的帮助! – user1905203

0

我劝你听从MadProgrammer的建议。如果您选择采用空白布局,请确保删除以前的JPanel并将新的内容添加到内容窗格window.setContentPane(panel2);并呼叫window.repaint()

1

对于panel2没有任何内容显示的原因是因为没有任何内容需要显示。简单地设置文本lbl2将显示该JPanel本身是可见的:

JLabel lbl2 = new JLabel("Some text"); 

我会,但是建议不要使用null布局,因为它中的开销对开发商设置位置&尺寸其中layout manager可以轻松管理您。

+0

也不起作用 – user1905203

相关问题