JavaFX TextField 中是否有多个插入符号?

Is there more than one caret in JavaFX TextField?

我目前正在接触 JavaFx。作为初学者,我尝试编写一个小型计算器。

此计算器包含一个显示要计算的表达式的文本字段。我可以通过键盘或计算器的按钮在其中输入文本。使用鼠标单击 TextField 或通过键盘导航会按预期在正确位置产生闪烁的插入符号。但是这个插入符号显然没有得到 TextField 的插入符号 属性 的支持,因为 textField.getCaretPosition(); returns 0 无论闪烁的 "mouse/keyboard-caret" 是否出现。使用 textField.forward()textField.backward() 等移动 "intern" 插入符号效果很好。

"mouse/keyboard-caret" 还有另一个 属性 吗?请不要告诉我我必须自己听鼠标点击并设置插入符号。同样的问题似乎出现在选择中,textField.getSelection() returns (0,0),尽管文本被选中(这意味着它是蓝色的)。

这是我在我的控制器中尝试做的事情-class。 textField.getText() 工作正常,所以 TextField 本身应该不是问题。

@FXML
private void onNumberButtonClicked(ActionEvent event){
    String formerText = textField.getText();
    int pos = textField.getCaretPosition(); //always returns 0, no matter were the cursor is
    String additionalText = ((Button)event.getSource()).getText();
    textField.setText(formerText.substring(0, pos) + 
    additionalText + 
    formerText.substring(pos));
}

感谢您的帮助!

TextField 失去焦点时,插入符号位置设置为 0。当您单击一个按钮时,它会获得焦点,因此 TextField 会使它失去焦点。您可以在控件失去焦点时存储旧的carret位置以解决此问题:

private int oldCaretPosition;
textField.focusedProperty().addListener((observable, oldValue, newValue) -> {
    if (!newValue) {
        oldCaretPosition = textField.getCaretPosition();
    }
});
private void onNumberButtonClicked(ActionEvent event){
    String formerText = textField.getText();
    String additionalText = ((Button)event.getSource()).getText();
    textField.setText(formerText.substring(0, oldCaretPosition)
                        + additionalText
                        + formerText.substring(oldCaretPosition));
}

或者您可以将 Buttonthe focusTraversable property 设置为 false