在主題中:當我在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());
}
}
爲什麼'setVisible(true/false)'爲每個組件?爲什麼不簡單使用[__CardLayout__](http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html),而不是手動添加/刪除?這個'Thread'是什麼?這個「舞臺」班在哪裏?您是否在使用'KeyListener's來控制上述的'SHIP'? –
此主題適用於動畫,Stage實現Runnable。我正在使用鍵綁定,將其添加到Stage Stage中。 CardLayout並不是最好的解決方案,因爲我想要做簡單的菜單,其中包含按鈕:「新遊戲」,「退出」。推後「新遊戲」manu應該消失和舞臺出現。當遊戲中的一切都在繪畫時,舞臺就像棋盤一樣。 – user3191398
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)(最小完整和可驗證示例)。 –