2014-06-16 82 views
-1

在主題中:當我在JFrame中更改JPanel時,我失去了焦點。我有班級遊戲,動作,按鈕。 我也在課堂上繪製遊戲舞臺。當我在JFrame中更改JPanel時,我失去了焦點

起初在遊戲中我有動作面板,其中包含按鈕,在按鈕NewGame後我改變面板在遊戲階段,但我不能控制船,我飛。

如何解決它或如何做到這一點不同?

Action.java

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.io.FileNotFoundException; 

import javax.swing.*; 


@SuppressWarnings("serial") 
public class Action extends JPanel { 
    public static final int xxx = 800; 
    public static final int yyy = 600; 
    private Button buttonPanel; 

    public Action(Game game) { 
     setLayout(new FlowLayout()); 
     setPreferredSize(new Dimension(xxx, yyy)); 

     buttonPanel = new Button(game); 
     add(buttonPanel); 

     setVisible(true); 
    } 


} 

Button.java

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class Button extends JPanel implements ActionListener{ 

    public static final int xxx = 100; 
    public static final int yyy = 300; 

    private JButton NewGame; 
    private JButton Scores; 
    private JButton Exit; 

    private Game game; 


    public Button(Game game) { 
     NewGame = new JButton("NewGame"); 
     Scores = new JButton("Scores"); 
     Exit = new JButton("Wyjście"); 
     this.game=game; 

     NewGame.addActionListener(this); 


     setLayout(new FlowLayout()); 
     setPreferredSize(new Dimension(xxx, yyy)); 
     add(NewGame); 
     add(Scores); 
     add(Exit); 
     setVisible(true);    
    } 

    public void actionPerformed(ActionEvent e) { 
     Object source = e.getSource(); 

     if(source == NewGame){ 
      game.setPanel("stage"); 
     } 
     ; 
    } 
} 

Game.java

@SuppressWarnings("serial") 
public class Game extends JFrame { 
    private Action menu; 
    private static Stage stage = new Stage(); 
    public Game() { 
     super("Lunar Lander"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(Stage.WIDTH,Stage.HEIGHT); 
     setMinimumSize(new Dimension(400,300)); 
     this.setResizable(true); 

     //stage = new Stage(0); 
     menu = new Action(this); 
     add(menu); 
     pack(); 
     //setPanel("stage"); 
     setVisible(true); 
    } 
    public void setPanel(String panel) { 
     if (panel=="stage") { 
      remove(menu); 
      add(stage); 
      pack(); 
     } else if (panel=="menu") { 
      remove(stage); 
      add(menu); 
      pack(); 
     } 
    } 
    public static void main(String[] args) throws FileNotFoundException { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Game(); 
      } 
     }); 
     Thread a = new Thread(stage); 
     a.start(); 
     while (a.isAlive()) {} 
     Scores scores = new Scores(); 
     scores.changeScores(stage.getPlayer().getName(),stage.getPlayer().getPoints()); 
    } 

} 
+1

爲什麼'setVisible(true/false)'爲每個組件?爲什麼不簡單使用[__CardLayout__](http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html),而不是手動添加/刪除?這個'Thread'是什麼?這個「舞臺」班在哪裏?您是否在使用'KeyListener's來控制上述的'SHIP'? –

+0

此主題適用於動畫,Stage實現Runnable。我正在使用鍵綁定,將其添加到Stage Stage中。 CardLayout並不是最好的解決方案,因爲我想要做簡單的菜單,其中包含按鈕:「新遊戲」,「退出」。推後「新遊戲」manu應該消失和舞臺出現。當遊戲中的一切都在繪畫時,舞臺就像棋盤一樣。 – user3191398

+0

1)對於一個空間中的許多組件,使用['CardLayout'](http://docs.oracle.com/javase/7/docs/api/java/awt/CardLayout.html)示例](http://stackoverflow.com/a/5786005/418556)。 2)爲了更快地獲得更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)(最小完整和可驗證示例)。 –

回答

2

但我無法控制船舶,這我在飛翔。

KeyEvents只傳遞給具有焦點的組件。當您更換面板時,面板不再有焦點。

不要使用KeyListener的。相反,你應該使用Key Bindings。然後,即使組件沒有焦點,您也可以處理該事件。

查看Motion Using the Keyboard瞭解更多信息和工作示例。

編輯:

  1. 不要使用 「==」 字符串比較。使用String.equals(...)方法。

  2. 變量名稱不應以大寫字母開頭。

+0

我使用密鑰綁定。 – user3191398

+0

您是否將綁定添加到根窗格?另請參閱編輯。 – camickr

+0

什麼意味着根窗格?當我正在繪製遊戲中的所有東西時,比如船,地面? – user3191398

相關問題