我目前正在接触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));
}
感谢您的帮助!
答案 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
。