一个框架中有多个JPanel /有一个托盘图像,另一个图层在顶部有一个组件

我有一个带有JPanel的JFrame,其中有一个带有ImageIcon()的JLabel。 一切都工作得很好,问题是我现在想要添加另一个JPanel以及其他所有东西,比如按钮等等到JFrame。 但它仍然显示背景图像在顶部,而没有与第二个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); } 

  1. 避免使用null布局,这里更麻烦,然后它们是值得的
  2. 将框架设置为BorderLayout
  3. 将标签添加到框架中
  4. 将标签布局设置为BorderLayout
  5. 创建面板并将其opaque属性设置为false
  6. 按照正常情况添加其他组件
  7. 将面板添加到标签

查看

  • 将图像作为背景放在扩展的JFrame上是否有任何问题?
  • 将JLabel置于JLabel之上,其中包含图像

举些例子

以示例更新

  • panel1是主要背景……
  • panel1的布局设置为BorderLayout
  • panel1添加到panel1
  • lbl1的布局设置为BorderLayout
  • panel2的布局设置为您想要使用的内容……
  • panel2的opacity属性设置为falsepanel2.setOpacity(false)
  • lbl2添加到panel2
  • panel2添加到panel2
  • panel1添加到您想要的内容中。

在此处输入图像描述

 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); } } } 

panel2显示没有任何内容的原因是因为没有任何内容可以显示。 只需设置lbl2文本就会显示JPanel本身是可见的:

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

但是,我建议不要使用null布局,因为它会为开发人员设置开销,以便设置布局管理器可以轻松管理的位置和尺寸。

我建议你留意MadProgrammer的建议。 如果选择使用null布局,请确保删除以前的JPanel并将新的JPanel添加到内容窗格window.setContentPane(panel2); 并调用window.repaint()