在框架上显示多个面板

时间:2015-08-14 13:22:35

标签: java swing

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

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);
            }
        });
    }

我遇到的问题如下。我能够显示背景图像 OR 可移动图像,但不能同时显示两者。我认为正在发生的是两个jpanels重叠'在彼此之上 - 这是正确的吗?我该如何解决这样的问题?我浏览了一下API,我找到了一个名为JLayeredPane的东西,但我不确定如何使用它,如果它甚至是正确的工具。您提供的任何见解都将非常受欢迎。

N.B。 ' addMotionSupport'方法只将KeyListener添加到传递的参数中。

1 个答案:

答案 0 :(得分:2)

  

角色可以在屏幕上移动图像,该图像位于背景图像的顶部。

然后你需要将角色添加到背景中。

所以基本代码应该是:

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()。然后框架将设置为背景图像的大小。