2017-02-16 71 views
-2

----修訂草稿----JavaFX - 如何將一個變量從控制器發送到Main類?

我一直在嘗試使用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(場景); startGame();)。正如你所看到的,我還需要在stage.show;之後放置它們。所以現在問題是,當我運行我的程序時,這三種方法立即運行(在我點擊菜單中的「OnlineGame」按鈕之前!)。

那麼有什麼方法可以實現我的目標(即玩家在點擊「OnlineGame」後會看到遊戲頁面)? PS:我簡化了我的代碼,使我的問題變得簡短(儘管它仍然很長:-D)。我不是母語的人,所以如果我的話很混亂,請讓我知道,以便我可以再次解釋。更重要的是,如果需要,我想發佈更多細節。

在此先感謝!

+0

我想直接在Gamecontroller.java中調用這三種方法,但它不起作用,因爲我需要在addHandlers(場景)中有「場景」; 。由於某些原因,我無法將它們設置爲靜態方法 –

+0

在我提供了答案後,您完全更改了此問題。 –

+0

嗨James_D!感謝您的回答,我不知道我的控制器中可能有監聽器,所以我添加了我的評論。現在我會嘗試一下,並告訴你它是否有效!順便說一句,抱歉我的誤導! –

回答

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文件以匹配這些名稱。)

+0

謝謝詹姆斯。是的,Main類中的邏輯沒有足夠的位置,所以我和我的朋友今天將邏輯移出,現在問題得到解決。 –

相關問題