1

小さなログイン ウィンドウとして開く javaFX 2 でアプリケーションを作成したいのですが、正しいデータを入力すると、大きなメイン ウィンドウが表示されます。どちらも fxml で設計されており、イベントは Java コード内で処理されます。

はい、わかっています。サンプルのアプリケーションとほぼ同じで、やりたいことを試してみたところ、そこで動作しました。

今、私のプロジェクトで同じことをしたとき、ステージの値を変更したいときに問題が発生しました。

以下のコードでわかるように、グローバル変数があり、start メソッドで primaryStage の値をそれに設定しています。試しにstartメソッドの最後に出力して値を設定してみました。

次に、ボタンがクリックされたときに使用しようとすると(メソッドbuttonClick)、ステージ変数の値がnullになるため、ウィンドウのサイズ変更などには使用できません。

私の質問は、2 つのプリント間で変更を何も使用していないにもかかわらず、ステージ変数の値がリセットされるのはなぜですか?

このコードは私が試したもののサンプルです。アプリケーションの動作を理解するのに重要ではないすべてのコードを切り取っただけです。

public class App extends Application {

    private Stage stage;
    @FXML
    private AnchorPane pane;

    @Override
    public void start(Stage primaryStage) {
        try {
            stage = primaryStage; // Set the value of primaryStage to stage
            primaryStage.setScene(new Scene(openScene("Login"))); // Load Login window
            primaryStage.show(); // Show the scene
        } catch (IOException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(stage);// <-- Here it has the value of primaryStage obviously
    }

    @FXML
    void buttonClick(ActionEvent event) throws IOException {
    // Note that even if I try to print here, the value of stage is still
    // null, so the code doesn't affect it
    // Also, this loads what I want, I just can't change the size.
        try{
           pane.getChildren().clear(); // Clear currently displayed content
           pane.getChildren().add(openScene("MainScene")); // Display new content
           System.out.println(stage); // <-- Here, output is null, but I don't know why
           stage.setWidth(500); // This line throws error because stage = null
        } catch (IOException ex) {
           Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }

    }  

    public Parent openScene(String name) throws IOException {
        //Code from FXML login example
        Parent parent = (Parent) FXMLLoader.load(PrijavnoOkno.class.getResource(name
                + ".fxml"), null, new JavaFXBuilderFactory());
        return parent;
    }

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

1 に答える 1

2

buttonClickアクションメソッドが誰によってどこで呼び出されるかは明確ではありませんが、でのログインボタンのアクションであると思いますLogin.fxml。また、このLogin.fxmlのコントローラーとしてApp(別名)を定義したと仮定します。 これらの仮定によれば、App.classには2つのインスタンスがあります。1 つはアプリの起動時に作成され、ステージ変数がメソッドのプライマリステージに割り当てられ 、もう1つはFXMLLoaderによって作成され(Login.fxmlのロード中に)、ステージ変数は割り当てられていないため、NPEです。 正しい方法の1つは、Login.fxml用の新しいControllerクラスを作成し、その中でログインアクションを呼び出すことです。そこからグローバルステージにアクセスします(アプリで静的にすることにより)。PrijavnoOkno

start()

于 2012-08-13T12:20:29.077 に答える