java,swing-在JScrollPane中添加JlayeredPane只会显示空白背景

java,swing-在JScrollPane中添加JlayeredPane只会显示空白背景,java,swing,jpanel,jscrollpane,jlayeredpane,Java,Swing,Jpanel,Jscrollpane,Jlayeredpane,我已经为此寻找了一个解决方案,但没有成功。也许是因为我的设置不同。我正在尝试制作一个电梯模拟器,我有一张图: 我有这个密码: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.

我已经为此寻找了一个解决方案,但没有成功。也许是因为我的设置不同。我正在尝试制作一个电梯模拟器,我有一张图: 我有这个密码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

@SuppressWarnings("serial")
public class Test extends JFrame {

    public Test() {

        Container contentPane = getContentPane();
        GridBagConstraints constraints = new GridBagConstraints();
        JButton floor = new JButton();
        JLabel cab = new JLabel();
        JPanel floorPanel = new JPanel();
        JPanel cabPanel = new JPanel();
        JLayeredPane layeredPane = new JLayeredPane();
        JScrollPane scroll = new JScrollPane();

        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        contentPane.setBackground(Color.BLUE);
        contentPane.setLayout(new GridBagLayout());

        constraints.insets = new Insets(20, 92, 20, 92);

        floorPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
        floorPanel.setPreferredSize(new Dimension(165, 165));

        floor.setPreferredSize(new Dimension(165, 165));
        floor.setBackground(Color.WHITE);
        floor.setText("1");

        cab.setPreferredSize(new Dimension(165, 165));
        cab.setText("Cab");
        cab.setBackground(Color.BLACK);
        cab.setLocation(0, 0);

        cabPanel.setLayout(null);
        cabPanel.setPreferredSize(new Dimension(165, 165));
        cabPanel.setOpaque(false);
        cabPanel.add(cab);

        layeredPane.setLayout(new BorderLayout());
        layeredPane.setPreferredSize(new Dimension(165, 165));
        layeredPane.add(floorPanel, 0);
        layeredPane.add(cabPanel, 1);

        scroll.setMinimumSize(new Dimension(183, 660));
        scroll.setMaximumSize(new Dimension(183, 660));
        scroll.setViewportView(layeredPane);

        contentPane.add(scroll, constraints);

        pack();
        setVisible(true);
    }

}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.border.Border;

@SuppressWarnings("serial")
public class LayeredExample extends JPanel {

    public LayeredExample() {
        int gridRows = 20;
        int gridCols = 10;
        JPanel panelA = new JPanel(new GridLayout(gridRows, gridCols));
        for (int i = 0; i < gridRows; i++) {
            for (int j = 0; j < gridCols; j++) {
                String labelText = String.format("[%d, %d]", j + 1, i + 1);
                JLabel label = new JLabel(labelText);

                Border outsideBorder = BorderFactory.createLineBorder(Color.BLUE);
                Border insideBorder = BorderFactory.createEmptyBorder(3, 3, 3, 3);
                label.setBorder(BorderFactory.createCompoundBorder(outsideBorder, insideBorder));
                panelA.add(label);
            }
        }
        panelA.setBorder(BorderFactory.createTitledBorder("Panel A"));
        panelA.setSize(panelA.getPreferredSize());
        panelA.setLocation(0, 0);

        JLabel dragMeLabel = new JLabel("Drag Me!");
        dragMeLabel.setFont(dragMeLabel.getFont().deriveFont(Font.BOLD, 54f));
        JPanel panelB = new JPanel(new GridBagLayout());
        panelB.add(dragMeLabel);
        panelB.setBorder(BorderFactory.createTitledBorder("Panel B"));
        panelB.setPreferredSize(new Dimension(800, 500));
        panelB.setSize(panelB.getPreferredSize());
        panelB.setLocation(200, 200);

        MouseAdapter myMouse = new MouseAdapter() {
            private Point p0;
            private Point loc0;

            @Override
            public void mousePressed(MouseEvent e) {
                p0 = e.getLocationOnScreen();
                loc0 = ((JComponent) e.getSource()).getLocation();
            }

            private void moveComponent(MouseEvent e) {
                if (p0 == null || loc0 == null) {
                    return;
                }
                Point p1 = e.getLocationOnScreen();
                JComponent comp = (JComponent)e.getSource();
                Container cont = comp.getParent();
                int x = loc0.x + p1.x - p0.x;
                int y = loc0.y + p1.y - p0.y;
                Point loc1 = new Point(x, y);
                comp.setLocation(loc1);
                cont.repaint();
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                moveComponent(e);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                moveComponent(e);
                p0 = null;
                loc0 = null;
            }
        };

        panelB.addMouseListener(myMouse);
        panelB.addMouseMotionListener(myMouse);

        JLayeredPane layeredPane = new JLayeredPane();
        layeredPane.add(panelA, JLayeredPane.DEFAULT_LAYER);
        layeredPane.add(panelB, JLayeredPane.PALETTE_LAYER);
        layeredPane.setPreferredSize(new Dimension(1600, 1200));

        JScrollPane scrollPane = new JScrollPane(layeredPane);
        scrollPane.getViewport().setPreferredSize(new Dimension(800, 650));

        setLayout(new BorderLayout());
        add(scrollPane);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("LayeredExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new LayeredExample());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
它不会显示添加到JLayeredPane的两个JPanel,只显示空白背景。我在JLayeredPane的第二层中的JPanel上尝试了setOpaque(false),但仍然不起作用

如果碰巧你已经在某处找到了解决方案,请发送一个链接。
Ps.抱歉语法错误

再次使用JLayeredPane,您需要设置添加到JLayeredPane的任何组件的位置和位置,因为它的行为就像具有空布局,但具有层

例如,签出并运行以下代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

@SuppressWarnings("serial")
public class Test extends JFrame {

    public Test() {

        Container contentPane = getContentPane();
        GridBagConstraints constraints = new GridBagConstraints();
        JButton floor = new JButton();
        JLabel cab = new JLabel();
        JPanel floorPanel = new JPanel();
        JPanel cabPanel = new JPanel();
        JLayeredPane layeredPane = new JLayeredPane();
        JScrollPane scroll = new JScrollPane();

        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        contentPane.setBackground(Color.BLUE);
        contentPane.setLayout(new GridBagLayout());

        constraints.insets = new Insets(20, 92, 20, 92);

        floorPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
        floorPanel.setPreferredSize(new Dimension(165, 165));

        floor.setPreferredSize(new Dimension(165, 165));
        floor.setBackground(Color.WHITE);
        floor.setText("1");

        cab.setPreferredSize(new Dimension(165, 165));
        cab.setText("Cab");
        cab.setBackground(Color.BLACK);
        cab.setLocation(0, 0);

        cabPanel.setLayout(null);
        cabPanel.setPreferredSize(new Dimension(165, 165));
        cabPanel.setOpaque(false);
        cabPanel.add(cab);

        layeredPane.setLayout(new BorderLayout());
        layeredPane.setPreferredSize(new Dimension(165, 165));
        layeredPane.add(floorPanel, 0);
        layeredPane.add(cabPanel, 1);

        scroll.setMinimumSize(new Dimension(183, 660));
        scroll.setMaximumSize(new Dimension(183, 660));
        scroll.setViewportView(layeredPane);

        contentPane.add(scroll, constraints);

        pack();
        setVisible(true);
    }

}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.border.Border;

@SuppressWarnings("serial")
public class LayeredExample extends JPanel {

    public LayeredExample() {
        int gridRows = 20;
        int gridCols = 10;
        JPanel panelA = new JPanel(new GridLayout(gridRows, gridCols));
        for (int i = 0; i < gridRows; i++) {
            for (int j = 0; j < gridCols; j++) {
                String labelText = String.format("[%d, %d]", j + 1, i + 1);
                JLabel label = new JLabel(labelText);

                Border outsideBorder = BorderFactory.createLineBorder(Color.BLUE);
                Border insideBorder = BorderFactory.createEmptyBorder(3, 3, 3, 3);
                label.setBorder(BorderFactory.createCompoundBorder(outsideBorder, insideBorder));
                panelA.add(label);
            }
        }
        panelA.setBorder(BorderFactory.createTitledBorder("Panel A"));
        panelA.setSize(panelA.getPreferredSize());
        panelA.setLocation(0, 0);

        JLabel dragMeLabel = new JLabel("Drag Me!");
        dragMeLabel.setFont(dragMeLabel.getFont().deriveFont(Font.BOLD, 54f));
        JPanel panelB = new JPanel(new GridBagLayout());
        panelB.add(dragMeLabel);
        panelB.setBorder(BorderFactory.createTitledBorder("Panel B"));
        panelB.setPreferredSize(new Dimension(800, 500));
        panelB.setSize(panelB.getPreferredSize());
        panelB.setLocation(200, 200);

        MouseAdapter myMouse = new MouseAdapter() {
            private Point p0;
            private Point loc0;

            @Override
            public void mousePressed(MouseEvent e) {
                p0 = e.getLocationOnScreen();
                loc0 = ((JComponent) e.getSource()).getLocation();
            }

            private void moveComponent(MouseEvent e) {
                if (p0 == null || loc0 == null) {
                    return;
                }
                Point p1 = e.getLocationOnScreen();
                JComponent comp = (JComponent)e.getSource();
                Container cont = comp.getParent();
                int x = loc0.x + p1.x - p0.x;
                int y = loc0.y + p1.y - p0.y;
                Point loc1 = new Point(x, y);
                comp.setLocation(loc1);
                cont.repaint();
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                moveComponent(e);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                moveComponent(e);
                p0 = null;
                loc0 = null;
            }
        };

        panelB.addMouseListener(myMouse);
        panelB.addMouseMotionListener(myMouse);

        JLayeredPane layeredPane = new JLayeredPane();
        layeredPane.add(panelA, JLayeredPane.DEFAULT_LAYER);
        layeredPane.add(panelB, JLayeredPane.PALETTE_LAYER);
        layeredPane.setPreferredSize(new Dimension(1600, 1200));

        JScrollPane scrollPane = new JScrollPane(layeredPane);
        scrollPane.getViewport().setPreferredSize(new Dimension(800, 650));

        setLayout(new BorderLayout());
        add(scrollPane);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("LayeredExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new LayeredExample());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.GridBagLayout;
导入java.awt.GridLayout;
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.*;
导入javax.swing.border.border;
@抑制警告(“串行”)
公共类LayerExample扩展了JPanel{
公共层重新示例(){
int gridRows=20;
int gridCols=10;
JPanel panelA=新的JPanel(新的网格布局(gridRows,gridCols));
对于(int i=0;icreateAndShowGui());
}
}

请创建并在问题中发布一个完整但简单的小示例程序,向我们展示问题,一个为我们编译和运行的程序。问题:为什么要将JLayeredPane嵌入JPanel中?这似乎没有任何作用。好的,谢谢。我是新来的,所以我不知道,我要编辑它。关于将其嵌入JPanel,这是因为JPanel有一个布局,而JLayaredPane没有一个作为默认布局,添加一个布局会删除它所具有的分层功能,或者我发现的解决方案。但是仍然不起作用。但是如果您所做的只是将JLayeredPane添加到JPanel中,而不向JPanel中添加任何其他内容,那么它没有任何作用,并且可能会增加混乱或问题。主要问题是,将JLayeredPane添加到JScroll中不会显示JLayeredPane,因此我尝试将其添加到JPanel中,然后添加到滚动条中。但它仍然不起作用。按照您的示例修复了JLayeredPane不遵循给定索引的问题。非常感谢你的帮助D