2017-05-25 3 views
0

私は2つのFXMLファイルがあると仮定します:mainとcustomコンポーネントを持つもの。私はこのように、カスタムコントローラからメインファイルコンポーネントにアクセスしたい:別のファイルコントローラからコンポーネントにアクセスするには?

Main.fxml:

<FlowPane> 
    <children> 
     <TextField fx:id="source" /> 
     <CustomBox fx:id="cbox" /> 
    </children> 
</FlowPane> 

Custom.fxml:

<fx:root type="HBox"> 
    <children> 
     <Button fx:id="showButton" onAction="#show" text="Show" /> 
    </children> 
</fx:root> 

CustomBox.java:

public class CustomBox extends HBox { 
    @FXML 
    private TextField source; 

    public CustomBox() { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("Custom.fxml")); 
     loader.setRoot(this); 
     loader.setController(this); 
     try { 
      loader.load(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @FXML 
    protected void show() { 
     System.out.println(source.getText()); 
    } 
} 

しかしshow()メソッドは私にNPEを与えます。どのようにコンポーネントとコントローラを別のファイルからバインドできますか?

+0

あなたはで定義されたコントロールを注入することはできません1つのFXMLファイルを別のFXMLファイル用のコントローラに追加することです。一般的に、定義されているFXML用のコントローラの外にコントロールを公開するのは悪い習慣です。代わりに、メインコントローラへの参照をカスタムコンポーネントに渡し、メインコントローラ上のメソッドを呼び出してテキストを取得します(またはMVCアプローチを使用してモデルクラスを定義し、両方のコントローラでモデルのインスタンスを共有します)。 –

答えて

0

あなたがメインのFXMLファイル用のコントローラを定義し、それからテキストを公開することができます。

public class MainController { 

    @FXML 
    private TextField source ; 

    @FXML 
    private CustomBox cbox ; 

    public String getText() { 
     return source.getText(); 
    } 

    @FXML 
    protected void initialize() { 
     cbox.setMainController(this); 
    } 
} 

そしてもちろんその後Main.fxmlファイル内のコントローラクラスとして

<FlowPane fx:controller="my.package.MainController"> 
    <children> 
     <TextField fx:id="source" /> 
     <CustomBox fx:id="cbox" /> 
    </children> 
</FlowPane> 

それを指定しますCustomBox

public class CustomBox extends HBox { 

    private MainController mainController ; 

    public CustomBox() { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("Custom.fxml")); 
     loader.setRoot(this); 
     loader.setController(this); 
     try { 
      loader.load(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void setMainController(MainController mainController) { 
     this.mainController = mainController ; 
    } 

    public MainController getMainController() { 
     return mainController ; 
    } 

    @FXML 
    protected void show() { 
     System.out.println(mainController.getText()); 
    } 
} 

と変更してくださいDこの、あなただけFXMLファイル内のメインコントローラを指定することができるかもしれない:

<FlowPane fx:controller="my.package.MainController"> 
    <children> 
     <TextField fx:id="source" /> 
     <CustomBox fx:id="cbox" mainController="$controller" /> 
    </children> 
</FlowPane> 

をしてからMainControllerinitialize()方法を省略します。

public class MainController { 

    @FXML 
    private TextField source ; 

    public String getText() { 
     return source.getText(); 
    } 

} 
+0

ありがとう、私は考えを得る。 –

関連する問題