2017-08-21 1 views
0

ログインステージ(300 x 250)があり、資格情報が正しい場合は別のメインステージ(フルスクリーン)を開きたいと思っています。JavaFXでステージを切り替える方法

ログイン資格情報を確認する方法を知りましたが、ログインステージを閉じて別のステージを開くにはどうすればよいですか?

+0

'stage.hide()'はステージを閉じます。新しいステージを作成し、 'show()'を呼び出してそれを表示します。 –

+0

https://github.com/sedj601/SimpleLoginFx – Sedrick

答えて

0

私のアプリケーションが1つのウィンドウで動作することになっている場合は、ウィンドウの変更を管理するGUIマネージャシングルトンクラスを使用することをお勧めします。以下では、このメカニズムを使用する単純なアプリケーションの完全なコードを提供しました。すべてのファイルがsampleという1つのパッケージに含まれているとします。

Main.java - あなたはここでのJavaFXコンポーネントを初期化:

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import java.io.IOException; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(Main.class.getResource("/sample/root.fxml")); 
     try{ 
     StackPane rootPane; 
     rootPane = loader.load(); 
     GuiManager guiModel = GuiManager.getInstance(); 
     guiModel.setRootPane(rootPane); 
     Scene scene = new Scene(rootPane); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     guiModel.changeWindow("/sample/firstwindow.fxml"); 
     } catch (IOException exception) { 
     exception.printStackTrace(); 
     } 


    } 

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

} 

root.fxmlを - すべてのウィンドウは、それに基づいてされることになっています

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.layout.StackPane?> 

<StackPane fx:id="rootPane" 
      xmlns="http://javafx.com/javafx/8.0.60" 
      xmlns:fx="http://javafx.com/fxml/1" 
      prefWidth="1" prefHeight="1"/> 

firstwindow.fxml - 最初の実際表示されるウィンドウ:

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.VBox?> 

<VBox xmlns:fx="http://javafx.com/fxml" fx:controller="sample.FirstWindowController"> 
    <Label text="First window"/> 
    <Button text="Change window" onAction="#changeWindow"/> 
</VBox> 

FirstWindowController.java - 最初のウィンドウ:

package sample; 

import javafx.fxml.FXML; 

public class FirstWindowController { 

    @FXML 
    private void changeWindow() { 
    GuiManager.getInstance().changeWindow("/sample/secondwindow.fxml"); 
    } 
} 

secondwindow.fxml - それは最初のウィンドウのボタンをクリックした後に表示されます。

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.VBox?> 

<VBox xmlns:fx="http://javafx.com/fxml" fx:controller="sample.SecondWindowController" > 
    <Label text="Second window"/> 
    <Button text="Change window" onAction="#changeWindow"/> 
</VBox> 

SecondWindowController.java - 第二ウィンドウのコントローラクラス:

package sample; 

import javafx.fxml.FXML; 

public class SecondWindowController { 

    @FXML 
    private void changeWindow() { 
    GuiManager.getInstance().changeWindow("/sample/firstwindow.fxml"); 
    } 
} 

GuiManager.java - ルートに基づいてウィンドウを変更するクラス。

package sample; 

import javafx.collections.ObservableList; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Node; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.stage.Window; 
import java.io.IOException; 

public class GuiManager { 

    private StackPane rootPane; 
    private static GuiManager instance; 

    public static GuiManager getInstance() { 
    if (instance == null) { 
     instance = new GuiManager(); 
    } 
    return instance; 
    } 

    private GuiManager() {} 

    public void changeWindow(String path) { 
    changeWindow(rootPane, path, this); 
    rootPane.setPrefWidth(-1); 
    rootPane.setPrefHeight(-1); 
    } 

    public static void changeWindow(Pane pane, String newWindowPath, Object callingController) { 
    Window window = pane.getScene().getWindow(); 
    double x = window.getX() + getHorizontalMidpoint(window); 
    double y = window.getY() + getVerticalMidpoint(window); 

    ObservableList<Node> childrenList = pane.getChildren(); 
    removeAllIncludedChildren(childrenList); 

    FXMLLoader loader = new FXMLLoader(callingController.getClass().getResource(newWindowPath)); 

    try { 
     pane.getChildren().add(loader.load()); 
     Stage primaryStage = (Stage) window; 
     primaryStage.setMinHeight(0); 
     primaryStage.setMinWidth(0); 
     window.sizeToScene(); 
     window.setX(x - getHorizontalMidpoint(window)); 
     window.setY(y - getVerticalMidpoint(window)); 
     primaryStage.setMinHeight(window.getHeight()); 
     primaryStage.setMinWidth(window.getWidth()); 
    } catch (IOException exception) { 
     exception.printStackTrace(); 
    } 
    } 

    private static double getHorizontalMidpoint(Window window) { 
    int horizontalBisectionCoefficient = 2; 
    return window.getWidth()/horizontalBisectionCoefficient; 
    } 

    private static double getVerticalMidpoint(Window window) { 
    int verticalBisectionCoefficient = 2; 
    return window.getHeight()/verticalBisectionCoefficient; 
    } 

    private static void removeAllIncludedChildren(ObservableList<Node> childrenList) { 
    for (int childIndex = 0; childIndex < childrenList.size(); childIndex++) { 
     childrenList.remove(childIndex); 
    } 
    } 

    public void setRootPane(StackPane rootPane) { 
    this.rootPane = rootPane; 
    } 
} 
0

私はちょうど同じ問題で実行し、this answerは短くて清潔である間に私の問題を完全に解決しました。

@FXML 
private void handleButtonAction(ActionEvent event) { 
System.out.println("You clicked me!"); 
label.setText("Hello World!"); 
//Here I want to swap the screen! 

Stage stageTheEventSourceNodeBelongs = (Stage) ((Node)event.getSource()).getScene().getWindow(); 
// OR 
Stage stageTheLabelBelongs = (Stage) label.getScene().getWindow(); 
// these two of them return the same stage 
// Swap screen 
stage.setScene(new Scene(new Pane())); 

}

PSは、オリジナルの答えをクリックして、それをupvoteすることを忘れないでください.:。男は値する。

PPS:答えをコピーするだけでいいのではない。(コメントを通してリンクを共有するのではなく)正しい答えがあるが、私はそれを可視性のために行うことにした。

関連する問題