2016-07-15 2 views
-1

JavaFX를 사용하는 데모 응용 프로그램을 개발하려고합니다. MainController와 AddUserController가 각각 2 개인 경우 .fxml 파일이 있고 main.fxml에 사용자 목록을 표시하는 테이블이 있고, 일부 필드가있는 사용자를 추가 할 수있는 창을 여는 버튼이 있습니다. 따라서 사용자 목록은 메모리 내장 DB에 포함됩니다.JavaFX의 컨트롤러간에 통신 할 수 없음

사용자를 추가 할 때 테이블이 목록으로 채워지지 않습니다.

MainController.java

public void setTestUser(){ 
    List<Users> users = new ArrayList(); 
    Users user = new Users(); 
    user.setName("Name"); 
    user.setSurname("Surname"); 
    users.add(user); 
    name.setCellValueFactory(new PropertyValueFactory<Users, String>("name")); 
    surname.setCellValueFactory(new PropertyValueFactory<Users, String>("surname")); 
    usersTable.setItems(FXCollections.observableArrayList(users)); 
} 

AddUserController.java

private void handleAddUser(ActionEvent event) throws IOException { 

    FXMLLoader fxmlLoader = new FXMLLoader(); 
    fxmlLoader.load(getClass().getResource("/fxml/main.fxml").openStream()); 
    MainController mainController = fxmlLoader.getController(); 

    Users user = new Users(); 
    user.setName(name.getText()); 
    user.setSurname(surname.getText()); 
    user.setDateOfBirth(dateOfBirth.getValue().toString()); 

    usersService.add(user); 

    mainController.populateUsersTable(); 
} 

그래서 문제가 무엇, 내가 usersTable.getItems();하려고하지만 만약 목록이 테이블이 업데이트되지 않습니다 사용자를 추가 한 후 멀리?

// UPDATE :

MainController.java에서 이것을 실행하려고

그것은 작동하고 OK

public void setTestUser(){ 
     List<Users> users = new ArrayList(); 
     Users user = new Users(); 
     user.setName("Name"); 
     user.setSurname("Surname"); 
     users.add(user); 
     name.setCellValueFactory(new PropertyValueFactory<Users, String>("name")); 
     surname.setCellValueFactory(new PropertyValueFactory<Users, String>("surname")); 
     usersTable.setItems(FXCollections.observableArrayList(users)); 
    } 
+0

GUI가 새로 고침되지 않습니까? –

+0

네가 맞아. – Denees

+0

코드가 불완전하고 어디에 (서) 어디서부터 불려지는지 절대적으로 불만이다. – glglgl

답변

2

이유는 새 창에서 당신이 처리 할 때마다 새로운 컨트롤러를 만드는 것이 될 수 "사용자 추가"이벤트. 이는 변경된 사항이 실제로 표시되는 창에 영향을주지 않으므로 분명히 잘못되었습니다.

대신 창을로드하고 어딘가에 저장하고 필요할 때 참조 할 때 컨트롤러를 가져와야합니다.

FXMLLoader myLoader = new FXMLLoader(
       getClass().getResource(screen.getFile()), 
       resources); 
Parent loadScreen = myLoader.load(); 
XYController myScreenController = myLoader.getController(); 
+0

도움을 주셔서 감사합니다. 그리고 BTW는 표결을 내릴 이유가 없었습니다. 다른 사람이 더 많은 정보를 요구하기를 원할 때 작성하거나 묻지 않습니다. 조언 만하면 너무 개인적으로 받아들이지 마십시오. – Denees

+0

@Denees 다행스럽게 도울 수 있습니다.글쎄, 실제로 나는 물었고, 결국 나는 추측해야만했다. 분명히 나는 ​​옳은 것 같았지만, 그것은 순수한 우연이었다. – glglgl

관련 문제