Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX-如何将变量从控制器发送到主类?_Java_Multithreading_Javafx - Fatal编程技术网

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

JavaFX-如何将变量从控制器发送到主类?,java,multithreading,javafx,Java,Multithreading,Javafx,----修订草案---- 我一直在尝试使用JavaFX创建一个游戏。在游戏中,玩家首先看到一个菜单页面(“玩游戏”、“选项”、“退出”等),然后点击“在线游戏”按钮开始游戏 现在我已经有了一个菜单(用fxml创建)和它的控制器 <!-- MainMenu.fxml --> <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.media.*?> <?import javafx.scen

----修订草案----

我一直在尝试使用JavaFX创建一个游戏。在游戏中,玩家首先看到一个菜单页面(“玩游戏”、“选项”、“退出”等),然后点击“在线游戏”按钮开始游戏

现在我已经有了一个菜单(用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>
菜单在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中也有一些初始化游戏的方法。正如你们所看到的,我还需要把它们放在stage.show;之后;。所以现在的问题是,当我运行我的程序时,这三种方法会立即运行(在我点击菜单中的“OnlineGame”按钮之前!)

那么,有什么方法可以实现我的目标(即,玩家在点击“在线游戏”后看到游戏页面)

注:我简化了我的代码,使我的问题简短(尽管它仍然很长:-D)。我不是以英语为母语的人,所以如果我的话令人困惑,请让我知道,以便我能再次解释。更重要的是,如果必要的话,我想发布更多的细节


提前谢谢

将所有逻辑移到控制器:它在
应用程序
类中没有位置

如果您希望仅在按下按钮时调用这三个方法,那么显而易见的做法是从按钮的处理程序方法调用它们:

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。您需要更改FXML文件以匹配这些名称。)

我考虑过直接在Gamecontroller.Java中调用这三个方法,但它不起作用,因为我需要在addHandlers(scene)中使用“scene”。由于某些原因,我不能将它们设置为静态方法。在我给出答案后,你完全改变了这个问题。嗨,詹姆斯!谢谢你的回答,我不知道我的控制器中可以有一个侦听器,所以我添加了我的评论。现在我来试试看,如果有用就告诉你!顺便说一句,对不起我的误导!请删除此问题,直到您决定要问什么为止。现在你在浪费别人的时间。好的,一直谢谢你。谢谢你,詹姆斯。是的,在主课堂上没有足够的地方放逻辑,所以我和我的朋友今天把逻辑移出了课堂,现在问题解决了。
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();
    }

    // ...
}