2017-03-16 1 views
0

タイトルが多少曖昧である可能性があるので、少し上手く定義することができます。私は作業中のコード(下にある)を持っています:私が取り組んでいるゲームのためのシンプルなメインメニューです。スタートボタンを除き、すべてがうまくいきます。ボタンのクリックでJavaFXの新しいシーンをクリック

私ができるようにしたいのは、[スタート]ボタンをクリックして、同じシーン(ウィンドウ)に新しいシーンを表示させることです。私は新しい窓が開いているのを見たくない。私はJavaでもっと経験豊富な人と話しました、彼らは私に、MenuFXとGameFXのために別々のクラスを作るように言いました。そのような場合は、GameFXクラスのMenuFXクラスからいくつかの起動メソッドまたは起動メソッドを呼び出す必要があります。これが最善のアプローチですか、あるいはすべてのFX関連のコードを1つのクラスに保存したいですか?また、私はすべての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); 
    } 

} 

Restating:開始ボタンをクリックして、現在開いているウィンドウを空のシーンに変更したいとします。ここで

は、その全体が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)投稿は非常に私の質問に似ています。私はちょうどそれに起こった。また、私はルートが何であるか理解していません。私は多くのコードサンプルでそれを見てきましたが、まだまだ私にはあまりにも深みがあるようです。私は無知なので、申し訳ありませんが、実際に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()); 
}); 
関連する問題