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

时间:2012-12-14 21:27:12

标签: java swing jframe jpanel jlabel

我有一个带有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);

}

3 个答案:

答案 0 :(得分:2)

  1. 避免使用空布局,这里有更多麻烦,值得
  2. 将布局设置为BorderLayout
  3. 将标签添加到框架
  4. 将标签布局设置为BorderLayout
  5. 创建面板并将其opaque属性设置为false
  6. 按照正常情况添加其他组件
  7. 将面板添加到标签
  8. 结帐

    例如

    使用示例更新

    • panel1是主要背景......
    • panel1的布局设置为BorderLayout
    • lbl1添加到panel1
    • lbl1的布局设置为BorderLayout
    • panel2的布局设置为您想要使用的内容......
    • panel2的不透明度属性设置为falsepanel2.setOpacity(false)
    • lbl2添加到panel2
    • panel2添加到lbl1
    • 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);
    
            }
        }
    }
    

答案 1 :(得分:1)

panel2似乎没有显示任何内容的原因是因为无法显示任何内容。只需设置lbl2的文字即可显示JPanel本身可见:

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

我会建议不要使用null布局,因为它会将开销放在开发人员身上以设置位置& layout manager可以轻松管理的维度。

答案 2 :(得分:0)

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