2016-12-28 22 views

答えて

0

EventHandlerが実行される前に、フォーカスがButtonに移動します。これは、EventHandlerがプロパティをチェックするときには、TextFieldがフォーカスされなくなったことを意味します。
あなたはしかしScenefocusOwner財産に耳を傾け、最後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); 
    } 
}); 
関連する問題