2017-04-10 1 views
0

사용자가 [X] 버튼을 클릭하면 응용 프로그램을 데이터 양식에 가까운 상태로 변경하려고합니다. 응용 프로그램에서 사용자는 TableView의 행을 두 번 클릭하여 행을 편집 할 수 있습니다. 변경이 이루어지고 사용자가 [X]를 클릭하면 사용자에게 변경 사항을 확인하도록 요청한 다음 변경 사항을 저장합니다. 아래 코드는 제가 지금까지 가지고있는 것입니다.JavaFX는 보조 창 닫기/숨기기시 데이터 형식 변경 사항을 저장합니다.

메인 컨트롤러 :

Scene scene = new Scene(decorator);  scene.getStylesheets().add(LawnCareSystem.class.getResource("/resources/css/style.css").toExternalForm()); 
     stage.setScene(scene); 
     stage.setOnHidden(new EventHandler<WindowEvent>() { 
      @Override 
      public void handle(WindowEvent event) { 
       EditCustomerController.saveChanges(); 
      } 
     }); 
     stage.show(); 

보조 컨트롤러 :

public static void saveChanges(CustomerRow cr){ 
     StringBuilder sb = new StringBuilder(100); 
     sb.append("update Customers"); 

     if(!cFName.getText().equals(cr.getFirstName())){ 
      sb.append(" set FirstName = '"+cFName.getText()+"',"); 
     } 
     if(!cLName.getText().equals(cr.getLastName())){ 
      sb.append(" set LastName = '"+cLName.getText()+"',"); 
     } 
     if(!cEMail.getText().equals(cr.getEmail())){ 
      sb.append(" set Email = '"+cEMail.getText()+"',"); 
     } 
     if(!cPhoneNumber.getText().equals(cr.getPhoneNumber())){ 
      sb.append(" set PhoneNumber = '"+cPhoneNumber.getText()+"',"); 
     } 
     sb.deleteCharAt(sb.length()-1); 
     sb.append(" where Customer_ID = "+cCustomerID); 
     . . . 
     . . 
     . 
    } 

문제는 saveChanges를이 이벤트 핸들러에 액세스하기 위해 정적 이루어져야한다는 것입니다. 더 나은 해결책이 있어야하며 여러분이 그 방향으로 나를 지적 해 주길 바랍니다.

+0

키워드를 방법에서 static 키워드 만 제거하면됩니다. 왜 정적으로 만들어야합니까? "정적"은 접근성과 아무런 관련이 없습니다. 범위에 관한 것입니다. 비 정적으로 만들고 컨트롤러 클래스가 아닌 컨트롤러 * 인스턴스 *를 사용하여 호출하십시오. –

+0

컨트롤러 인스턴스에서 어떻게 호출합니까? 컨트롤러에서 스테이지에 액세스 할 수 있습니까? – JGray

+1

아니요, 컨트롤러 인스턴스에 대한 참조를 사용하여 호출해야합니다. 즉,'EditCustomerController controller = loader.getController();','controller.saveChanges();','loader'는 'FXMLLoader' 인스턴스였습니다. 'EditCustomerController'가 컨트롤러 클래스 인 FXML 파일을로드하는 데 사용됩니다. –

답변

1

saveChanges 메서드를 정적이 아니게 만들고 컨트롤러 클래스 대신 컨트롤러에 대한 참조를 사용하여 호출해야합니다. FXML 로더에서 컨트롤러에 대한 참조를 얻을 수 있습니다.

당신은 FXML를로드,하지만 당신은 바로 전에 그것을 할 가정에 대한 코드를 보여주지 않았다

당신이 할 것이라고는 SceneStage 작성 :

FXMLLoader loader = new FXMLLoader(getClasS().getResource("/path/to/fxml")); 
Parent decorator = loader.load(); 
EditCustomerController editCustomerController = loader.getController(); 

Scene scene = new Scene(decorator);  scene.getStylesheets().add(LawnCareSystem.class.getResource("/resources/css/style.css").toExternalForm()); 
stage.setScene(scene); 
stage.setOnHidden(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     editCustomerController.saveChanges(); 
    } 
}); 
stage.show(); 

다음 컨트롤러 물론,

+0

고맙습니다. 잘 했어! – JGray

관련 문제