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

2022-01-24 00:00:00 java swing jlabel jpanel jframe

我有一个带有 JPanel 的 JFrame,其中有一个带有 ImageIcon() 的 JLabel.一切正常,问题是我现在想在 JFrame 中添加另一个 JPanel,其中包含按钮等所有其他内容.但它仍然在顶部显示背景图像,而第二个 JPanel 则没有.

I've got a JFrame with a JPanel in which there is a JLabel with an ImageIcon(). Everything's working perfectly, problem is i now want to add another JPanel with all the other stuff like buttons and so on to the JFrame. But it still shows the background Image on top and nothing with the second JPanel.

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

Can someone help me? Here is an extract of my code:

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. 避免空布局,这里的麻烦比它们值得的多
  2. 将框架布局设置为BorderLayout
  3. 将标签添加到框架中
  4. 将标签布局设置为BorderLayout
  5. 创建您的面板并将其 opaque 属性设置为 false
  6. 照常添加其他组件
  7. 将面板添加到标签中

结帐

  • 将图像作为背景放置在扩展的 JFrame 上是否有任何问题?
  • 将 JLabel 放在 JLabel 之上图片在

举例

更新示例

  • panel1是主背景...
  • 设置panel1的布局为BorderLayout
  • lbl1 添加到 panel1
  • 设置lbl1的布局为BorderLayout
  • panel2 的布局设置为您想使用的任何内容...
  • panel2 的 opacity 属性设置为 false (panel2.setOpacity(false))
  • lbl2 添加到 panel2
  • panel2 添加到 lbl1
  • panel1 添加到您想要的所有内容中.
  • panel1 is the main background...
  • Set panel1's layout to BorderLayout
  • Add lbl1 to panel1
  • Set lbl1's layout to BorderLayout
  • Set panel2's layout to what ever you want to use...
  • Set panel2's opacity property to false (panel2.setOpacity(false))
  • Add lbl2 to panel2
  • Add panel2 to lbl1
  • Add panel1 to what every you want.

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

        }
    }
}

相关文章