我正在用java编写一款简单的2D游戏。到目前为止,我有一个GGame类,它基本上描述了整个游戏/它的状态。与这个游戏的唯一互动是通过
GGame#render(width, height) : BufferedImage
和
GGame#addEvent(event) : void
当游戏启动时,创建一个JFrame,并将扩展JPanel的GamePanel添加到框架中。GamePanel正在做所有的事情,从发送事件到渲染/重新绘制自身。
现在我想在游戏顶部添加GUI(库存,一些其他信息,…)。我的想法是简单地让GUI扩展JPanel并将其添加到像GamePanel这样的框架中,同时GUI有一个对GGame的引用来询问库存等。
这里要明确的是,我不想在游戏旁边添加GUI,而是在它上面。我的问题是,我总是需要所有的事件传递到两个面板,而顶部的一个(GUI)是透明的。此外,我希望两个面板都能自动适应窗口大小(GamePanel通过每次渲染器获取面板大小来实现这一点)。
实现这样的东西的最好方法是什么,为什么?
下面是具有您所要求的功能的两个面板的演示。请看评论。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
public class LayeredPaneDemo extends JFrame{
private JLayeredPane layeredPane;
private RedPanel redPanel;
private YellowPanel yellowPanel;
public LayeredPaneDemo() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(300, 310));
//Create and set up the layered pane.
layeredPane = new JLayeredPane();
//create a red panel
redPanel = new RedPanel();
redPanel.setBackground(Color.RED);
//make it the same size as parent
redPanel.setBounds(getBounds());
//at it to layered pane with index of 1
layeredPane.add(redPanel, 1);
//similarly make yellow panel
yellowPanel = new YellowPanel (redPanel); //yellow panel has a reference
//to red panel
yellowPanel.setBackground(Color.YELLOW);
yellowPanel.setBounds(getBounds());
layeredPane.add(yellowPanel, 2);
//add a mouse listener to both panels
redPanel.addMouseListener(getMouseListener(yellowPanel));
yellowPanel.addMouseListener(getMouseListener(redPanel));
setContentPane(layeredPane);
layeredPane.setLayout(new BorderLayout(0, 0));
setVisible(true);
}
//mouse listener: when a panel is clicked, the other panel
//is moved to front
private MouseListener getMouseListener(JPanel panel) {
return new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
layeredPane.moveToFront(panel);
}
};
}
public class RedPanel extends JPanel {
RedPanel(){
}
//returns a fixed value
public int getValue() {
return 16;
}
}
public class YellowPanel extends JPanel {
YellowPanel(RedPanel redPanel){
//add a label showing value retrieved from red panel
add(new JLabel("Value from red panel is :"+ redPanel.getValue()));
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LayeredPaneDemo();
}
});
}
}
如果需要,不要犹豫,要求澄清。
(上面也演示了https://stackoverflow.com/help/mcve。更容易