2016-09-08 7 views
0

私はそれは簡単な質問だと思うが、それは仕事で長い日だったし、今は正しい方法を理解できない。Java FX Controller経由で他のビューにデータを渡す

私は3つのFXMLファイルを持っています。

  • Menge.fxml
  • Start.fxml
  • Suche.fxml

私はActionListener

を以下の私が持っている MainController内部で通常の

@Override 
public void start(Stage primaryStage) { 
    try { 
     AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("Start.fxml")); 
     Scene scene = new Scene(root); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

としてMain.javaから始めています

@FXML 
void actionListenerMenge(ActionEvent event) { 
    try { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Menge.fxml")); 
     Parent root1 = (Parent) fxmlLoader.load(); 
     Stage stage = new Stage(); 
     stage.setScene(new Scene(root1)); 
     stage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

FXMLLoaderを使用してSuche.fxmlを開きます。 私のSuche-Viewの中にbuttonがあります。これは、ユーザーが特定のデータレコードを検索する場所の別のシーンを開きます。私は私のMenge.fxmlからの眺めを更新するMengeController @TextField内の値を編集したい私はFXMLLoader

を経由して再び
FXMLLoader loader = new FXMLLoader(getClass().getResource("Menge.fxml")); 
try { 
    Parent root = loader.load(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
MengeController controller = (MengeController)loader.getController(); 

MengeControllerをロードしています

@FXML 
void actionListenerSuche(ActionEvent event) { 
    try { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Suche.fxml")); 
     Parent root1 = (Parent) fxmlLoader.load(); 
     Stage stage = new Stage(); 
     stage.setScene(new Scene(root1)); 
     stage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

SucheController。しかし、私が行う場合

controller.setTextFieldValue("abc")それは更新されていません。 MengeControllerを2回ロードして2つのインスタンスがあるので、それが必要であることがわかります。しかし、私はそれを一度だけロードする方法や、TextFieldMengeControllerにアップデートするために注入する方法を理解していません。

+0

よう

public class SucheController { private MengeController mengeController ; public void setMengeController(MengeController mengeController) { this.mengeController = mengeController ; } // ... @FXML private void someHandlerMethod() { mengeController.setTextFieldValue("abc"); } } 
はその後Suche.fxmlをロードし、あなたのMengeController内のコードが見えます。 –

+0

フローはスタート - > ButtonClickを介して 'Menge.fxml'(テーブルビューを含む)を開きます - >' Suche.fxmlを開きます。 (ボタンは 'Menge.fxml'にあります)。 – Kevin

+0

あなたはその質問を編集できますか?それは何ですか... –

答えて

0

オプション1:SucheControllerに財産を守ってください。

SucheControllerでプロパティを定義します。代わりに、単にプロパティを設定し、バックMengeControllerへの参照を取得しようとしているの:

public class SucheController { 

    private final ObjectProperty<Foo> foo = new SimpleObjectProperty<>(); 

    public ObjectProperty<Foo> fooProperty() { 
     return foo() ; 
    } 

    public final Foo getFoo() { 
     return fooProperty().get(); 
    } 

    public final void setFoo(Foo foo) { 
     fooProperty().set(foo); 
    } 

    // ... 

    @FXML 
    private void someHandlerMethod() { 

     // FXMLLoader loader = new FXMLLoader(getClass().getResource("Menge.fxml")); 
     // try { 
     //  Parent root = loader.load(); 
     // } catch (IOException e) { 
     //  e.printStackTrace(); 
     // } 
     // MengeController controller = (MengeController)loader.getController(); 

     setFoo(...); 
    } 
} 

明らかにユーザーがここで提供されるものは何でもデータを表すタイプでFooを交換し、それに応じてプロパティやメソッドに名前を付けます...

ここでSuche.fxmlを読み込むときに、コントローラへの参照を取得してそのプロパティを観察してください。次に、あなただけのMengeController自体に直接テキストフィールドを更新することができます。

@FXML 
void actionListenerSuche(ActionEvent event) { 
    try { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Suche.fxml")); 
     Parent root1 = (Parent) fxmlLoader.load(); 

     SucheController sucheController = loader.getController(); 
     sucheController.fooProperty().addListener((obs, oldFoo, newFoo) -> { 
      someTextField.setText(newFoo.getSomeValue()); 
      // ... 
     }); 

     Stage stage = new Stage(); 
     stage.setScene(new Scene(root1)); 
     stage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

オプション2:SucheControllerに直接MengeControllerへの参照を渡す:私はドン

別のオプションを」コントローラ間のカップリングが増えているのと同じように、MengeControllerへの参照をSucheController

に渡すだけです私はあなたがだから私はFXMLLoader経由 `Menge.fxml`を開いています」という意味だと思い
@FXML 
void actionListenerSuche(ActionEvent event) { 
    try { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Suche.fxml")); 
     Parent root1 = (Parent) fxmlLoader.load(); 

     SucheController sucheController = fxmlLoader.getController(); 
     sucheController.setMengeController(this); 

     Stage stage = new Stage(); 
     stage.setScene(new Scene(root1)); 
     stage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

James!#1は魅力的に機能しました。ありがとう!:-) – Kevin

関連する問題