java - 在 JLayeredPane 上添加两个 JPanel 后没有任何输出

标签 java swing user-interface jpanel jlayeredpane

我想要做的是覆盖两个面板,其中我通过使用 JLabel 在背景面板中插入图像,并且我希望另一个较小的面板出现在同一背景图像上!这是我写的:

import javax.swing.*;
import javax.swing.text.html.ImageView;

import java.awt.*;

public class addImage extends JFrame {

    private JLabel label;
    private ImageIcon Image;
    private JButton b;
    private JPanel panel1;
    private JPanel panel2;
    private JLayeredPane layerpanel;

    public addImage() {
        // JFRame
        super("First Time adding Image");
        setLayout(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setSize(400, 400);

        // JLabel containing Image
        Image = new ImageIcon(getClass().getResource("image1.jpg"));
        // Adding Image in JLabel
        label = new JLabel(Image);

        // Adding Label to panel1
        panel1 = new JPanel();
        panel1.add(label);

        // JPanel2
        panel2 = new JPanel();
        panel2.setBackground(Color.darkGray);
        panel2.setPreferredSize(new Dimension(200, 200));
        panel2.setOpaque(true);

        // LAyeredPane adding both panels
        layerpanel = new JLayeredPane();
        layerpanel.setLayout(new BorderLayout());
        layerpanel.add(panel1, new Integer(0), 0);
        layerpanel.add(panel2, new Integer(1), 1);

        add(layerpanel);

    }

    public static void main(String[] args) {
        new addImage();

    }

}

执行这段代码后,除了空帧之外,我没有得到任何输出! 我收到这些错误:

Exception in thread "main" java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null)
    at java.awt.BorderLayout.addLayoutComponent(Unknown Source)
    at java.awt.Container.addImpl(Unknown Source)
    at javax.swing.JLayeredPane.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at addImage.<init>(addImage.java:45)
    at addImage.main(addImage.java:53)

我已经检查了所有相关问题,但仍然无法找到解决方案!!!! 任何形式的帮助将不胜感激!谢谢

最佳答案

你的问题在这里:

layerpanel.setLayout(new BorderLayout());
layerpanel.add(panel1, new Integer(0), 0);
layerpanel.add(panel2, new Integer(1), 1);

这并没有帮助

setLayout(null);

JLayeredPane 现在要求您向其传递 BorderLayout 的有效约束之一(例如 BorderLayout.NORTH)。

话虽如此,我不确定您希望通过这样做实现什么目标。

您可以通过使用 CardLayout 获得相同的效果,但困惑程度要少得多,请参阅 How to Use CardLayout了解更多详情

我可以使用类似的东西“复制”您想要的输出

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class AddImage extends JFrame {

    private JLabel label;
    private ImageIcon Image;
    private JButton b;
    private JPanel panel1;
    private JPanel panel2;
    private JLayeredPane layerpanel;

    public AddImage() {
        // JFRame
        super("First Time adding Image");
        setLayout(new BorderLayout());
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setSize(400, 400);

        // JLabel containing Image
//      Image = new ImageIcon(getClass().getResource("image1.jpg"));
        // Adding Image in JLabel
        label = new JLabel("Help");

        // Adding Label to panel1
        panel1 = new JPanel();
        panel1.add(label);

        // JPanel2
        panel2 = new JPanel();
        panel2.setBackground(Color.darkGray);
        panel2.setPreferredSize(new Dimension(200, 200));
        panel2.setOpaque(true);

        // LAyeredPane adding both panels
        layerpanel = new JLayeredPane();
        layerpanel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        layerpanel.add(panel1, gbc);
        layerpanel.add(panel2, gbc);

        layerpanel.setLayer(panel1, new Integer(0));
        layerpanel.setLayer(panel2, new Integer(1));

        add(layerpanel);

    }

    public static void main(String[] args) {
        new AddImage();

    }

}

关于java - 在 JLayeredPane 上添加两个 JPanel 后没有任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36407818/

相关文章:

java - 多行标题不起作用。

java - 在 Swing 中使用 Libjitsi 库处理 H264 编码的 RTP 视频流 - 如何渲染流?

java - 当用户在字段中输入时,将 $ 符号添加到文本字段中

java - JBoss中如何知道某个模块依赖于哪些模块?

java - AWS SES - 554 消息被拒绝

java - 命令行参数是否有任何命名约定?

java - 从 JFrame 中删除标题栏后保留边框

python - 如何根据按钮点击无条件重新运行python程序?

c++ - 调暗对话框周围的屏幕

java - Guice 3.0 + Tomcat 7.0 = ClassLoader 内存泄漏