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图像和移动图像应该只是图像
或缓冲图像
的实例,而不是组件中的图像。一旦我们处于基本图像的阶段,所有的图像都被合并到一个组件中,单个元素的大小、缩放和定位就变得更容易了。我似乎把它复杂化了。非常感谢你的帮助。