2016-12-28 63 views

回答

0

EventHandler運行之前,重點轉移到Button。這意味着TextField不再專注於EventHandler檢查屬性。
你可以聽Scene不過的focusOwner財產和保存最後Node重點:

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(); 
} 

如果您使用的是FXML您可以通過添加一個監聽到的scene屬性可以訪問到現場initialize方法中的某個節點,並添加/刪除該偵聽器中的偵聽器。

root是在下面的代碼片斷一些節點:

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); 
    } 
});