2016-10-22 268 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問題)。