2017-03-16 139 views
0

標題可能有點模糊,所以請允許我將它定義得更好一點。我有一段代碼(在下面):一個簡單的主菜單,用於我正在開發的遊戲。一切運作良好,除了開始按鈕。JavaFX按鈕上的新場景點擊

我想要做的是點擊開始按鈕,並在相同的舞臺(窗口)上出現一個新的場景。我不想看到一個新窗口打開。我曾經和一些更有經驗的Java交流過,他們告訴我爲MenuFX和GameFX創建單獨的類。如果是這樣的話,我需要在MenuFX類的GameFX類上調用一些啓動或啓動方法,對嗎?這是最好的方法,還是我想在所有類中保留所有與FX相關的代碼?另外,我應該爲所有的外匯工作保持同一個舞臺,不是嗎?

This雖然後文提到了一些事情,但我並不熟悉討論的一些術語 - 例如,我仍然不理解Root的概念。

此外,this後談論類似的應用程序,但我沒有使用FXML或SceneBuilder ...我不知道它是否有任何關係。

MenuFX.java - 爲了簡潔起見,我已經刪除了一些工作代碼。您可以看到,我需要幫助的是將「開始」按鈕綁定到某種功能,以創建一個新的空白場景。

/* 
* This is simply working on the title screen. 
*/ 

// Asssume all imports are correct 
import java.everythingNeeded 


public class MenuFX extends Application { 
@Override 

     public void start (Stage primaryStage) { 

     // Make the window a set size... 
     primaryStage.setResizable(false); 


     // Create menu vbox and set the background image 
     VBox menuVBox = new VBox(30); 
     menuVBox.setBackground(new Background(new BackgroundImage(new 
     Image("image/bambooBG.jpg"), null, null, null, new BackgroundSize(45, 
     45, true, true, true, true)))); 



     // Create start button 
     Button startButton = new Button("Start Game"); 

     // TODO Some things... 
     // Need assistance here 



     // Create help button 
     Button helpButton = new Button("Help"); 
     helpButton.setOnAction(e -> THINGS); 

     // Create music toggle button 
     ToggleButton musicButton = new ToggleButton("Music On/Off"); 
     musicButton.setOnAction(e -> THINGS); 

     // Create credits button 
     Button creditsButton = new Button("Credits"); 
     creditsButton.setOnAction(THINGS); 

     // Create exit button and set it to close the program when clicked 
     Button endButton = new Button("Exit Game"); 
     endButton.setOnAction(e -> Platform.exit()); 

     // Add all nodes to the vbox pane and center it all 
     // Must be in order from top to bottom 
     menuVBox.getChildren().addAll(startButton, helpButton, musicButton, creditsButton, endButton); 
     menuVBox.setAlignment(Pos.CENTER); 

     // New scene, place pane in it 
     Scene scene = new Scene(menuVBox, 630, 730); 

     // Place scene in stage 
     primaryStage.setTitle("-tiles-"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 


    // Needed to run JavaFX w/o the use of the command line 
    public static void main(String[] args) { 

     launch(args); 
    } 

} 

重述:我想單擊開始按鈕並使當前打開的窗口變爲空白的場景。

這裏是全部的MenuFX類的引擎收錄: http://pastebin.com/n6XbQfhc

感謝您的幫助,

巴格爾

+0

這是不是很清楚你在問什麼。您的'GameFX'類只需要擴展某種類型的節點類,或者訪問節點實例。然後,當按下按鈕時,可以用該節點替換場景的根。 [Here](http://stackoverflow.com/questions/32464698/java-how-do-i-start-a-standalone-application-from-the-current-one-when-both-are)是一篇文章I回答了一段時間,這似乎有點類似:爲每個班級打開新的窗口,但你顯然不必這樣做。如果這沒有幫助,你可能需要澄清你的問題。 –

+0

@James_D [This](http://stackoverflow.com/questions/36551431/can-you-write-two-different-java-fx-scenes-as-two-separate-classes?rq=1)post很類似於我的問題。我剛剛發生了。另外,我不明白Root是什麼。我在很多代碼示例中都看到了它,但對於我來說,它似乎對我來說太深入了。我很抱歉聽起來很無知,但我實際上在自學Java,特別是JavaFX。這個學期我的導師似乎有些不合情理。 – Psychobagger

+0

「根」指的是場景圖的根節點,即在場景中顯示的節點。 [Oracle教程](http://docs.oracle.com/javase/8/javafx/scene-graph-tutorial/scenegraph.htm#JFXSG107)用「示例」描述了「場景圖」術語。 (FWIW,聲稱你在掙扎,因爲你的教練不好,不會在這裏得到你的同情。我們許多人,如果不是大多數人,都來自一個你不得不自學的時代;而這個網站的主要觀衆是沒有人教他們的奢侈專業程序員。) –

回答

2

這裏的基本想法是,你會做這樣的事情:

public class GameFX { 

    private final BorderPane rootPane ; // or any other kind of pane, or Group... 

    public GameFX() { 

     rootPane = new BorderPane(); 

     // build UI, register event handlers, etc etc 

    } 

    public Pane getRootPane() { 
     return rootPane ; 
    } 

    // other methods you may need to access, etc... 

} 

現在回到MenuFX班,你會做

Button startButton = new Button("Start Game"); 
startButton.setOnAction(e -> { 
    GameFX game = new GameFX(); 
    primaryStage.getScene().setRoot(game.getRootPane()); 
});