我正在用java编写一个简单的2D游戏。到目前为止,我已经有了一个 GGame 类,它基本上描述了整个游戏/它的状态。与此 GGame 的唯一交互是通过
GGame#render(width, height) : BufferedImage
和
GGame#addEvent(event) : void
当游戏启动时,将创建一个 JFrame,并将扩展 JPanel 的 GamePanel 添加到框架中。 GamePanel 正在做所有事情,从发送事件到 GGame 并渲染它/重新绘制自身。
现在我想在 GGame 之上添加一个 GUI(库存、一些其他信息……)。我的想法是简单地让 GUI 扩展 JPanel 并将其像 GamePanel 一样添加到框架中,同时 GUI 引用 GGame 来询问库存等。
在这里要明确的是,我不想在 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();
}
});
}
}