Events JavaFx状态更改侦听器

Events JavaFx状态更改侦听器,events,menu,javafx,handler,scene,Events,Menu,Javafx,Handler,Scene,我正在开发一个应用程序,我想在其中实现一个菜单。我有一个游戏状态和一个主菜单类。两者都扩展了组。我不知道如何将更改侦听器写入Main.state,因此当它从菜单更改为游戏时,场景将切换 以下是主菜单类的一部分: public class MainMenu extends Group { private final Image background; private final Rectangle bgRect; private final int buttonNo = 3; private Me

我正在开发一个应用程序,我想在其中实现一个菜单。我有一个
游戏状态
和一个
主菜单
类。两者都扩展了
。我不知道如何将更改侦听器写入
Main.state
,因此当它从
菜单更改为
游戏时,场景将切换

以下是
主菜单
类的一部分:

public class MainMenu extends Group {
private final Image background;
private final Rectangle bgRect;
private final int buttonNo = 3;
private MenuButton[] buttons;
private final double xStart = -200;
private final double yStart = 100;
private Group root;
private Scene scene;


public MainMenu () {
    background = new Image(getClass().getResource("mainmenuBg.png").toString());        
    bgRect = new Rectangle(660,660);
    bgRect.setFill(new ImagePattern(background));

    root = new Group();
    scene = new Scene(root, 650, 650);
    scene.setCamera(new PerspectiveCamera());

    root.getChildren().add(bgRect);

    initButtons(root);

    //Start game
    buttons[0].setOnMouseClicked(new EventHandler<Event>() {

        @Override
        public void handle(Event t) {
            Main.state = STATE.GAME;
        }
    });

    //Options
    buttons[1].setOnMouseClicked(new EventHandler<Event>() {

        @Override
        public void handle(Event t) {
            //options menu will come here
        }
    });

    //Exit
    buttons[2].setOnMouseClicked(new EventHandler<Event>() {

        @Override
        public void handle(Event t) {
            Platform.exit();
        }
    });
}
 //...
}

任何帮助都将不胜感激。

我成功地找到了一个好的解决方案。 我已经从这些类中删除了
scene
字段,并在构造函数中添加了
super
方法,然后将元素添加到类中(
this.getChildren().addAll(…)

最后,这里是我的主控制器:

public class Main extends Application {
public int difficulty = 1;
public GameState gameState = new GameState(difficulty);
public MainMenu mainMenu = new MainMenu();;
StackPane stackPane = new StackPane();

@Override
public void start(final Stage stage) {  
    stage.resizableProperty().setValue(false);
    stage.setTitle("Main");
    Scene scene = new Scene(stackPane, 650, 650);    
    scene.setCamera(new PerspectiveCamera());

    stage.setScene(scene);
    stage.show();

    stackPane.getChildren().add(mainMenu);

    mainMenu.getStartButton().setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent t) {
            changeScene(gameState);
            try {
                gameState.startGame();
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });

}

public void changeScene(Parent newPage) {
    stackPane.getChildren().add(newPage);

  EventHandler<ActionEvent> finished = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
      stackPane.getChildren().remove(0);
    }
  };

  final Timeline switchPage = new Timeline(
    new KeyFrame(Duration.seconds(0), new KeyValue(stackPane.getChildren().get(1).opacityProperty(), 0.0), new KeyValue(stackPane.getChildren().get(0).opacityProperty(), 1.0)),
    new KeyFrame(Duration.seconds(3), finished, new KeyValue(stackPane.getChildren().get(1).opacityProperty(), 1.0), new KeyValue(stackPane.getChildren().get(0).opacityProperty(), 0.0))
  );

  switchPage.play();
}
}
public类主扩展应用程序{
公共int难度=1;
公共游戏状态=新游戏状态(难度);
public main menu main menu=新建main menu();;
StackPane StackPane=新的StackPane();
@凌驾
公众假期开始(最后阶段){
stage.resizebleproperty().setValue(false);
舞台名称(“主要”);
场景=新场景(stackPane,650、650);
scene.setCamera(新透视摄像头());
舞台场景;
stage.show();
stackPane.getChildren().add(主菜单);
mainMenu.getStartButton().setOnAction(新的EventHandler()){
@凌驾
公共无效句柄(ActionEvent t){
改变场景(游戏状态);
试一试{
gameState.startName();
}捕获(中断异常例外){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex);
}
}
});
}
公共无效更改场景(父新页){
stackPane.getChildren().add(newPage);
EventHandler finished=新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
stackPane.getChildren().remove(0);
}
};
最终时间线切换页面=新时间线(
新关键帧(持续时间.seconds(0),新键值(stackPane.getChildren().get(1).opacityProperty(),0.0),新键值(stackPane.getChildren().get(0).opacityProperty(),1.0)),
新关键帧(持续时间.秒(3),完成,新键值(stackPane.getChildren().get(1).opacityProperty(),1.0),新键值(stackPane.getChildren().get(0).opacityProperty(),0.0))
);
switchPage.play();
}
}
public class Main extends Application {
public int difficulty = 1;
public GameState gameState = new GameState(difficulty);
public MainMenu mainMenu = new MainMenu();;
StackPane stackPane = new StackPane();

@Override
public void start(final Stage stage) {  
    stage.resizableProperty().setValue(false);
    stage.setTitle("Main");
    Scene scene = new Scene(stackPane, 650, 650);    
    scene.setCamera(new PerspectiveCamera());

    stage.setScene(scene);
    stage.show();

    stackPane.getChildren().add(mainMenu);

    mainMenu.getStartButton().setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent t) {
            changeScene(gameState);
            try {
                gameState.startGame();
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });

}

public void changeScene(Parent newPage) {
    stackPane.getChildren().add(newPage);

  EventHandler<ActionEvent> finished = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
      stackPane.getChildren().remove(0);
    }
  };

  final Timeline switchPage = new Timeline(
    new KeyFrame(Duration.seconds(0), new KeyValue(stackPane.getChildren().get(1).opacityProperty(), 0.0), new KeyValue(stackPane.getChildren().get(0).opacityProperty(), 1.0)),
    new KeyFrame(Duration.seconds(3), finished, new KeyValue(stackPane.getChildren().get(1).opacityProperty(), 1.0), new KeyValue(stackPane.getChildren().get(0).opacityProperty(), 0.0))
  );

  switchPage.play();
}
}