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));
}
或者您可以将 Button
的 the focusTraversable
property 设置为 false
。
我目前正在接触 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));
}
或者您可以将 Button
的 the focusTraversable
property 设置为 false
。