2016-12-28 1 views

답변

0

EventHandler이 실행되기 전에 초점이 Button으로 이동합니다. 즉 EventHandler이 속성을 확인할 때 TextField이 더 이상 초점을 맞추지 않는다는 의미입니다.
당신은 비록 ScenefocusOwner 재산을 듣고 마지막 Node 집중 절약 할 수있다 : 당신이 fxml를 사용하는 경우

private static class FocusData { 

    private TextField textField = null; 

    public TextField getTextField() { 
     return textField; 
    } 

    public void setFocusedNode(Node node) { 
     this.textField = node instanceof TextField ? (TextField) node : null; 
    } 

    public boolean isTextField() { 
     return textField != null; 
    } 

} 

@Override 
public void start(Stage primaryStage) { 

    final FocusData focusData = new FocusData(); 

    Button btn = new Button("Print Text"); 
    btn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      if (focusData.isTextField()) { 
       System.out.println(focusData.getTextField().getText()); 
      } 
     } 
    }); 

    VBox root = new VBox(); 
    for (int i = 0; i < 5; i++) { 
     root.getChildren().add(new TextField()); 
    } 

    Scene scene = new Scene(root); 
    scene.focusOwnerProperty().addListener(new ChangeListener<Node>() { 

     @Override 
     public void changed(ObservableValue<? extends Node> observable, Node oldValue, Node newValue) { 
      focusData.setFocusedNode(oldValue); 
     } 
    }); 

    root.getChildren().add(btn); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

당신의 scene 속성에 리스너를 추가하여 장면에 액세스 할 수 있습니다 일부 노드에서 initialize 메서드를 사용하고 해당 수신기에서 수신기를 추가/제거합니다.

final ChangeListener<Node> listener = new ChangeListener<Node>() { 

    @Override 
    public void changed(ObservableValue<? extends Node> observable, Node oldValue, Node newValue) { 
     focusData.setFocusedNode(oldValue); 
    } 
}; 

if (root.getScene() != null) { 
    root.getScene().focusOwnerProperty().addListener(listener); 
} 

root.sceneProperty().addListener(new ChangeListener<Scene>() { 

    public void changed(ObservableValue<? extends Scene> observable, Scene oldValue, Scene newValue) { 
     if (oldValue != null) { 
      oldValue.focusOwnerProperty().removeListener(listener); 
     } 
     if (newValue != null) { 
      newValue.focusOwnerProperty().addListener(listener); 
     } 
     listener.changed(null, null, null); 
    } 
}); 
:

root

다음과 같은 코드의 일부 노드
관련 문제