2017-12-21 14 views
0

私は異なるボタンがクリックされたときに同じカスタムポップアップウィンドウを表示する必要があるアプリケーションを作成しています。今すぐポップアップは単純な "Are You Sure?OK/Cancel"ウィンドウですが、後でそれがさらにカスタマイズされた機能を含むように拡張されるので、Quickie Dialogの組み込み関数を使用することはできません。javaFX :: popupウィンドウは起動しますが、コントローラは...?

ここは奇妙なことです。ボタンXが押されると、popUp(FXMLで定義された)がうまく起動しますが、コントローラクラスが実行されていないようです。私はあなたがそれをすることができるとは思わなかった。私が理解できないのはなぜコントローラが動作していないかです。私はコントローラが動作していない場合、アプリケーションがクラッシュすると思っていただろう。ここで

」ボタンがポップアップを起動するために呼び出すコードは:

private void popUpLaunch(Button caller){ 
    Stage popUpStage = new Stage(); 
    Parent root; 

    try { 
     root = FXMLLoader.load(getClass().getResource("popUp1.fxml")); 
     popUpStage.setScene(new Scene(root)); 
     popUpStage.initModality(Modality.APPLICATION_MODAL); // popup 
     popUpStage.initOwner(caller.getScene().getWindow()); 
     popUpStage.showAndWait(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

そのすべてが素晴らしい作品。ここで/src/sl/view/popUp1.fxml、完全FXMLです:

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.text.Font?> 
<?import javafx.scene.text.Text?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="130.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sl.view.PopUp1Controller"> 
    <children> 
     <Text fx:id="popUpMessageText" layoutX="14.0" layoutY="14.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Message Goes Here" textAlignment="CENTER" wrappingWidth="577.6708984375" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <font> 
      <Font size="38.0" /> 
     </font> 
     </Text> 
     <Button fx:id="btnPopUpOK" layoutX="126.0" layoutY="68.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="157.0" text="OK" /> 
     <Button fx:id="btnPopUpCancel" layoutX="286.0" layoutY="68.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="169.0" text="Cancel" /> 
    </children> 
</AnchorPane> 

ウィンドウ負荷だけで罰金。そして最後に、ここでは完全なコントローラ、/src/sl/view/PopUp1Controller.javaです:

package sl.view; 
import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class PopUp1Controller { 
    @FXML Text popUpMessageText; 
    @FXML Button btnPopUpOK; 
    @FXML Button btnPopUpCancel; 
    Stage stage; 

    public void start(Stage stage) throws Exception{ 
     System.out.println("Popup controller launched!"); // never reach this... so the controller is not launching??? 
     this.stage = stage; 
     popUpMessageText.setText("Interesting message here!"); 
     btnPopUpOK.setOnAction(event -> { 
      System.out.println("You cliced OK..."); 
     }); 
     btnPopUpCancel.setOnAction(event -> { 
      System.out.println("You cliced Cancel"); 
      stage.close(); 
     }); 
    } 
} 

いくつかの考えは...

私はFXMLを生成するためにSceneBuilderを使用しました。そのAnchorPaneのControllerクラスを割り当てたら、ドロップダウンメニューから "sl.view.PopUp1Controller"を選んだ。だから私はそれが正しいと確信しています。

他の「JavaFX Popup」投稿を見てきましたが、私の問題を具体的に解決するものはありません。ポストの多くは、「なぜ、これらの他のポップアップオプションを使用するのではなく車輪の再発明ない?」、基本的に以下の記事のようなものです。例: JavaFX 2 custom popup pane 私の場合、は再発明したいですホイールは、普段より多くの機能を実行するためにポップアップが必要なので、単純なダイアログボックスにはなりません。あなたは、コントローラが初期化されるときに実行initialize()方法でそれを置くために、コントローラのコードをしたい場合は

+0

'(スタート)'メソッドは、コントローラに呼び出されることはありません(なぜあなたはそれが呼ばれると思いますか?)コードを 'initialize()'(引数なし)というメソッドに入れてください。 [documentation](https://docs.oracle.com/javase/9​​/docs/api/javafx/fxml/doc-files/introduction_to_fxml.html#controllers)を参照してください。また、組み込みのダイアログでは、任意のノードを[コンテンツ](https://docs.oracle.com/javase/9​​/docs/api/javafx/scene)として設定できるので、ほぼ確実に必要なことを行うことができます。 /control/DialogPane.html#contentProperty)。 –

答えて

1

documentation参照):

public class PopUp1Controller { 
    @FXML Text popUpMessageText; 
    @FXML Button btnPopUpOK; 
    @FXML Button btnPopUpCancel; 

    public void initialize() { 
     System.out.println("Popup controller launched!"); // never reach this... so the controller is not launching??? 
     popUpMessageText.setText("Interesting message here!"); 
     btnPopUpOK.setOnAction(event -> { 
      System.out.println("You cliced OK..."); 
     }); 
     btnPopUpCancel.setOnAction(event -> { 
      System.out.println("You cliced Cancel"); 
      btnPopupCancel.getScene().getWindow().hide(); 
     }); 
    } 
} 
+0

素晴らしい、それは魅力のように働いた。そして、ドキュメントを指摘してくれてありがとう。私はJavaアプリケーションでクラスを取っています。私は良い読書が大好きです。 – Pete

関連する問題