2016-10-22 225 views
0

我正在用java编写一个简单的2D游戏。到目前为止,我已经有了一个GGame类,它基本上描述了整个游戏/它的状态。与此GGame唯一相互作用是经由简单的Java /游戏的Swing GUI

GGame#render(width, height) : BufferedImage 

GGame#addEvent(event) : void 

当游戏启动一个JFrame被创建并且北京时间延伸的JPanel一个的GamePanel被添加到该帧。 GamePanel正在做所有事情,从发送事件到GGame并渲染/重新绘制自己。

现在我想在GGame的顶部添加一个GUI(库存,其他一些信息......)。我的想法是简单地让GUI扩展JPanel并将其添加到像GamePanel这样的框架,而GUI具有对GGame的参考来询问库存等。

要在这里明确,我不想添加GUI在GGame旁边,但在它之上。我的问题是,我总是需要传递给两个面板的所有事件,而最上面的一个(GUI)是透明的。此外,我希望这两个面板自动适应窗口大小(GamePanel通过每次渲染时获取面板大小来实现)。

最好的方式来实现这样的事情,为什么?

+0

你是否简单地问如何将一个JPanel放在另一个JPanel上,在任何给定的时间只显示一个JPanel?如果是这样,请考虑https://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html – c0der

+0

基本上是的,但我不想自动适应窗口大小,我需要传递给两个面板的事件 –

回答

2

下面是两个具有所需功能的面板的演示。 请参阅评论。

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,它更容易帮助 帮助解决MCVE问题)。