小さなログイン ウィンドウとして開く 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);
}
}