JavaFX - 如何将变量从控制器发送到Main类?

时间:2017-02-16 22:25:46

标签: java multithreading javafx

----修订草稿----

我一直在尝试使用JavaFX创建游戏。在游戏中,玩家首先看到一个菜单页面("玩游戏","选项","退出"等),他/她点击了" OnlineGame"按钮开始游戏。

现在我已经有了一个菜单(用fxml创建)及其控制器。

<!-- MainMenu.fxml -->

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.media.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.effect.*?>
<?import java.lang.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainMenuController">
   <children>  
        <Button fx:id="OnlineGame" layoutX="55.0" layoutY="157.0" mnemonicParsing="false" onAction="#OnlineGame" opacity="0.6" prefHeight="51.0" prefWidth="229.0" text="Play Online Game" textFill="#2067a1">
            <font>
        <Font size="21.0" />
            </font>
        </Button>
   </children>
</AnchorPane>

控制器:

import *****;
//MainMenuController.java
public class MainMenuController{
@FXML private Button OnlineGame;

@FXML protected void OnlineGame(ActionEvent event) throws IOException{
    //start the game
}
}

菜单在Main.start中初始化,效果很好。

import *****;
public class Main extends Application {
public void start(Stage Stage) {
    try {
        Parent root = FXMLLoader.load(getClass().getResource("MainMenu.fxml"));
        Scene scene = new Scene(root,730,439); //set SceneSize
        Stage.setScene(scene);
        Stage.show();

        //call three methods to start a game
        prepareGame();
        addHandlers(scene);
        startGame();

    } catch(Exception e) {
        e.printStackTrace();
    }
}

private void prepareGame(){**********}
private void addHandlers(Scene scene){***********}
private void startGame(){****}

public static void main(String[] args) {
    launch(args);
}

但是,我在Main.start中也有一些初始化游戏的方法。(prepareGame(); addHandlers(scene); startGame();)。如你所见,我还需要在stage.show之后放置它们。所以现在的问题是,当我运行我的程序时,这三种方法立即运行(在我点击我的&#34; OnlineGame&#34;菜单中的按钮之前!)。

那么有没有办法实现我的目标(即玩家在点击&#34; OnlineGame&#34;后看到游戏页面?)

PS:我简化了我的代码以使我的问题变得简短(虽然它仍然很长:-D)。我不是母语,所以如果我的话容易混淆,请告诉我,以便我再解释一下。更重要的是,如果有必要,我想发布更多细节。

提前致谢!

1 个答案:

答案 0 :(得分:0)

将所有逻辑移动到控制器:它在Application类中没有位置。

如果你想在按下按钮时只调用这三个方法,那么显而易见的事情就是从按钮的处理程序方法中调用它们:

public class MainMenuController {

    @FXML
    private Button onlineGame ;

    @FXML
    private void onlineGame(ActionEvent event) {
        // button can't be pressed until it is in a scene, so getScene()
        // here cannot return null:
        addHandlers(game.getScene());
        prepareGame();
        startGame();
    }

    // ...
}

(请注意,我更改了字段和一些方法名称,使其符合标准Java naming conventions。您需要更改FXML文件以匹配这些名称。)