2016-09-08 3 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을 여는 중입니다. 내 수세보기 안에 button이있어 사용자가 특정 데이터 레코드를 검색해야하는 다른 장면이 열립니다. 내가 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 나는 나의 Menge.fxml에서보기를 업데이트 할 MengeController @ 2 TextField 내부의 값을 편집 할 수 있습니다. 하지만 내가 할 경우

controller.setTextFieldValue("abc") 업데이트되지 않습니다. 내가 MengeController을 두 번로드했기 때문에 그것이 있어야한다는 것을 알고 있으므로 두 개의 인스턴스가 있습니다. 그러나 나는 한번만로드하거나 삽입하여 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의 코드 보인다. 이제 Menge-view 내부에 버튼이 있습니다 ... "아니면 내가 오해 했습니까? –

+0

Flow가 시작되었습니다 -> ButtonClick을 통해'Menge.fxml' (테이블 뷰 포함)을 엽니 다 ->'Suche.fxml 'ButtonClick (버튼이'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을로드 할 때 컨트롤러에 대한 참조를 가져 와서 속성을 관찰하십시오.

@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 : 그럼 그냥 MengeController에서 직접 자체를 텍스트 필드를 업데이트 할 수 있습니다 내가 '돈되는

또 다른 옵션 : 직접 SucheControllerMengeController에 대한 참조를 전달 컨트롤러간에 더 많은 결합이 필요한만큼 간단하게 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

제임스! # 1은 매력처럼 작동했습니다. 감사합니다! :-) – Kevin

관련 문제