在一帧中一个以上的JPanel /具有在顶部具有brackground图像和另一层使用部件(More

2019-07-05 08:43发布

我有一个JPanel的一个JFrame,其中有一个JLabel有一个ImageIcon()。 一切都可以正常使用,问题是我现在想与如按钮的所有其他的东西等等到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);

}

Answer 1:

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

查看

  • 是否有对扩展的JFrame将图片作为背景的任何问题?
  • 将一个JLabel与图像中的JLabel上方

举些例子

更新与范例

  • panel1是主要的背景...
  • 设置panel1的布局BorderLayout
  • 添加lbl1panel1
  • 设置lbl1的布局BorderLayout
  • 一套panel2的布局,你想用什么都...
  • 一套panel2的不透明度属性为falsepanel2.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);

        }
    }
}


Answer 2:

没有什么似乎显示了其原因panel2是因为没有什么可以显示。 简单地设置文本lbl2将显示该JPanel本身是可见的:

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

我会,但是建议不要使用null布局,它给开发者设置的位置和尺寸其中的开销布局管理器可以轻松管理你。



Answer 3:

我劝你听从MadProgrammer的建议。 如果你选择去用一个空的布局,确保您删除以前JPanel并添加新的内容窗格window.setContentPane(panel2); 并调用window.repaint()



文章来源: More than one JPanel in a Frame / having a brackground Image and another Layer with Components on the top