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

时间:2016-03-17 07:45:24

标签: java javafx javafx-8 textfield

我目前正在接触JavaFx。作为首发,我试着写一个小型计算器。

此计算器包含一个TextField,显示要计算的表达式。我可以通过键盘或计算器的按钮将文本放在那里。使用鼠标单击TextField或通过键盘导航会导致按照预期在正确的位置闪烁插入符号。但是这个插入显然不受TextField的插入符属性的支持,因为textField.getCaretPosition();返回0,无论闪烁的“鼠标/键盘插入符号”出现。使用textField.forward()textField.backward()等移动“实习生”插入符号就可以了。

“鼠标/键盘插入符号”还有其他属性吗?请不要告诉我,我必须自己听点击鼠标并设置插入符号。同样的问题似乎在选择中出现,textField.getSelection()返回(0,0),尽管选择了文本(这意味着它是蓝色的)。

这是我在控制器类中尝试做的事情。 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));
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

0失去焦点时,插入符号位置设置为TextField。当您单击按钮时,它会获得焦点,因此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));
}

或者,您可以将Button的{​​{3}}设置为false