2012-07-13 27 views
5

私はJavaFxを初めて使用しています。アプリケーションを作成していて、スイングコンポーネントを使用している間に提供されたJDialogと同様のものが必要でした。私は新しいステージを作成することでそれを解決しましたが、今はボタンをクリックするだけで新しいステージを閉じることができます。 (はい、xボタンも機能しますが、ボタン上にもボタンが必要です)。状況を説明するには: 私はシーンからメインステージを作成するメインクラスを持っています。私はFXMLを使っています。JavaFX2:内部でステージ(サブステージ)を閉じる

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml")); 
    stage.setTitle("Ring of Power - Builder"); 
    stage.setScene(new Scene(root)); 
    stage.setMinHeight(600.0); 
    stage.setMinWidth(800.0); 
    stage.setHeight(600); 
    stage.setWidth(800); 
    stage.centerOnScreen(); 
    stage.show(); 
} 

今、私はFXMLおよび適切な制御クラスを介して行われたすべての管理項目やメニューやものを、持って表示されたメインウィンドウに表示されます。これは、[ヘルプ]メニューの[バージョン情報]を含めることに決めた部分です。

@FXML 
private void menuHelpAbout(ActionEvent event) throws IOException{ 
    Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml")); 
    Stage aboutBox=new Stage(); 
    aboutBox.setScene(new Scene(root2)); 
    aboutBox.centerOnScreen(); 
    aboutBox.setTitle("About Box"); 
    aboutBox.setResizable(false); 
    aboutBox.initModality(Modality.APPLICATION_MODAL); 
    aboutBox.show(); 
} 

ボックスウィンドウについて再び制御クラスとFXMLを介して作成されて見られるように:についてこのように活性化される - だから私は、イベントが時にメニューのヘルプに行く持っています。画像、テキストエリア、ボタンがあります。そのボタンをクリックすると、AboutBox.javaクラス内のaboutBoxという新しいステージを閉じることができます。

自分自身がこれを行うことができる唯一の方法は、 public static Stage aboutBoxを定義することでした。 がBuilder.javaクラス内にあり、閉じるボタンのアクションイベントを処理するメソッドのAboutBox.java内のものを参照します。しかし、どういうわけか、それはまったくきれいで正しいとは感じません。もっと良い方法はありますか?

アドバイスをいただきありがとうございます。

答えて

21

イベントハンドラに渡されるイベントから、終了するステージを派生させることができます。

new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent actionEvent) { 
    // take some action 
    ... 
    // close the dialog. 
    Node source = (Node) actionEvent.getSource(); 
    Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
    } 
} 
+8

このようにステージを閉じると、onCloseRequestイベントハンドラ(存在する場合)をバイパスします。私は行を追加しますstage.getOnCloseRequest()。ハンドル(null); stage.close()の直前。 – beardedlinuxgeek

+1

@ beardedlinuxgeekありがとうございました。私はこの問題を抱えていました。私の窓は閉まっていましたが、私が登録したイベントハンドラは呼び出されていませんでした。あなたのソリューションは問題を解決しました。 –

1

JavaFX 2.1では、選択肢がほとんどありません。 jewelseaの答えやメニュー項目のアクションイベントハンドラで

new AboutBox().show(); 

のような使用に

public class AboutBox extends Stage { 

    public AboutBox() throws Exception { 
     initModality(Modality.APPLICATION_MODAL); 
     Button btn = new Button("Close"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       close(); 
      } 
     }); 

     // Load content via 
     // EITHER 

     Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml")); 
     setScene(new Scene(VBoxBuilder.create().children(root, btn).build())); 

     // OR 

     Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build()); 
     setScene(aboutScene); 

     // If your about page is not so complex. no need FXML so its Controller class too. 
    } 
} 

のようにそれのバージョンをまだ行ったり変更したどのような方法で好きなよう。

+0

実際には解決策が少し難しいです。それはFXMLの最初のバージョンが気に入らないようです。 – Meg

+0

問題は、あなたがaboutPage.fxml < – Meg

+0

@Megを書いた理由でない限り、aboutBox.fxmlのコントロールクラスであると考えられるクラスAboutBox.javaを呼び出すという事実のようです。答えを更新しました。 AboutBox.javaはAboutBox.fxmlまたはAboutPage.fxmlのコントローラでもありません。 –

関連する問題