3

我有一个带有 JPanel 的 JFrame,其中有一个带有 ImageIcon() 的 JLabel。一切正常,问题是我现在想在 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);

}
4

3 回答 3

2
  1. 避免空布局,这里有更多的麻烦,那么它们是值得的
  2. 将框架布局设置为BorderLayout
  3. 将标签添加到框架
  4. 将标签布局设置为BorderLayout
  5. 创建您的面板并将其 opaque 属性设置为 false
  6. 正常添加其他组件
  7. 将面板添加到标签

查看

举些例子

更新示例

  • panel1是主要背景...
  • Setpanel1的布局为BorderLayout
  • 添加lbl1panel1
  • Setlbl1的布局为BorderLayout
  • panel2的布局设置为您想要使用的任何内容...
  • panel2的不透明度属性设置为false( panel2.setOpacity(false))
  • 添加lbl2panel2
  • 添加panel2lbl1
  • 添加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);

        }
    }
}
于 2012-12-14T21:39:59.017 回答
1

似乎什么都没有显示的原因panel2是因为没有什么可显示的。只需设置 text forlbl2将显示其JPanel本身是可见的:

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

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

于 2012-12-14T21:56:42.430 回答
0

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

于 2012-12-14T21:46:04.730 回答