Java 在一个框架上显示多个面板

Java 在一个框架上显示多个面板,java,swing,Java,Swing,我正在尝试创建一个基本的游戏,其中一个角色可以在屏幕上移动一个图像,该图像位于背景图像之上。这是我的主要方法,我在这里设置所有这些: public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){ public void run(){ JFrame.setDefaultLookAndFeelDecorated(true);

我正在尝试创建一个基本的游戏,其中一个角色可以在屏幕上移动一个图像,该图像位于背景图像之上。这是我的主要方法,我在这里设置所有这些:

public static void main(String[] args){

        EventQueue.invokeLater(new Runnable(){

            public void run(){
                JFrame.setDefaultLookAndFeelDecorated(true);
                JFrame frame = new JFrame("Stuff");
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

                //  Create a panel with a component to be moved                     
                JPanel character = new JPanel();
                JLabel component = new JLabel();
                component.setIcon(new ImageIcon("C:/Users/Cory/Desktop/img/eagle.jpg"));
                component.setSize( component.getPreferredSize() );
                component.setLocation(200, 200);
                component.repaint();
                JButton left = addMotionSupport( component );
                character.add(component);
                character.repaint();
                //end moveable
                frame.add( character );
                frame.repaint();

                JPanel background = new JPanel();
                JLabel contentPane = new JLabel();
                contentPane.setIcon(new ImageIcon("C:/Users/Cory/Desktop/img/background.png"));//sets contentPane to display the background
                contentPane.setSize(contentPane.getPreferredSize());
                background.add(contentPane);
                background.repaint();
                frame.add(background);
                frame.repaint();

                //frame.add(left, BorderLayout.SOUTH);
                frame.setSize(1000, 800);
                frame.setVisible(true);
            }
        });
    }
我遇到的问题如下。我可以显示背景图像或可移动图像,但不能同时显示两者。我认为正在发生的是,两个JPanel相互“重叠”——这是正确的吗?我怎样才能解决这样的问题?我浏览了一下API,发现了一个名为JLayeredPane的工具,但我不知道如何使用它,也不知道它是否是正确的工具。非常感谢您提供的任何见解

注意,'addMotionSupport'方法仅向传递的参数添加KeyListener

角色可以在屏幕上移动背景图像上方的图像

然后,您需要将角色添加到背景中

因此,基本准则应该是:

JLabel character = new JLabel(...);
character.setSize( character.getPreferredSize() );

JLabel background = new JLabel(...);
background.add( character );

frame.add( background );
你不需要额外的面板。可以将标签直接添加到框架中

您需要设置字符标签的大小,因为JLabel不使用布局管理器。因此,在本例中,当您将角色添加到背景组件时,您负责管理角色的大小和位置。该位置将默认为(0,0)


您不需要所有的
frame.repaint()
语句,当框架可见时,它将被绘制。不要使用frame.setSize(),而是使用frame.pack()。然后,框架将设置为背景图像的大小。

JFrame的默认布局管理器是
BorderLayout
。此布局允许在其5个部分(北、南、东、西、中)中的每一部分中包含一个组件。您正在将两个组件添加到同一中心部分,因此添加的第二个组件只是替换第一个组件。您不能像这样将组件层叠在一起。以下是有关如何使用
JLayeredPane
的文档,这是一种将组件分层的方法。但就个人而言,我会使用
Graphics2D
在一个JPanel上绘制我的背景和图像。您期望的输出是什么?在另一个图像上的可移动图像(不可移动)。对于这个问题,我会避免使用任何组件,但使用单个
JPanel
来绘制所有内容(或者使用单个
JLabel
来显示单个
BufferedImage
来“绘制所有内容”)。BG图像和移动图像应该只是
图像
缓冲图像
的实例,而不是组件中的图像。一旦我们处于基本图像的阶段,所有的图像都被合并到一个组件中,单个元素的大小、缩放和定位就变得更容易了。我似乎把它复杂化了。非常感谢你的帮助。