JFormattedTextField 焦点上的插入符位置
我在程序中使用了一些 JFormattedTextFields。由于某种原因,当单击文本字段后文本字段获得焦点时,插入符号位置始终跳至左侧(位置 0)。我希望插入符号最终位于用户单击的位置。因此,如果我在两个数字之间单击,插入符号应该最终位于这两个数字之间。
所以我实现了一个 FocusListener 来获取单击位置并在那里设置插入符位置。
FocusListener focusListener = new FocusListener(){
public void focusGained(FocusEvent evt) {
JFormettedTextField jftf = (JFormattedTextField) evt.getSource();
//This is where the caret needs to be.
int dot = jftf.getCaret().getDot();
SwingUtilities.invokeLater( new Runnable() {
public void run() {
'the textField that has focus'.setCaretPosition('Some how get the evt or dot');
}
});
}
public void focusLost (FocusEvent evt) {}
});
我尝试了很多方法来让他工作。我尝试过使用final关键字,它有效,但仅适用于单个文本字段。
我在焦点侦听器中使用了 set/get 方法来分配当前对象,但不确定如何使其“安全”(例如,它们是否需要同步?)。
也许我缺少什么?
I am utilizing a few JFormattedTextFields in my program. For some reason when the text field gains focus after a click on the text field, the caret position always jumps to the left (position 0). I would like the caret to end up at the location clicked by the user. So if I click in between two digits, the caret should end up in between those two digits.
So I implemented a FocusListener that would get the click location and set the caret position there.
FocusListener focusListener = new FocusListener(){
public void focusGained(FocusEvent evt) {
JFormettedTextField jftf = (JFormattedTextField) evt.getSource();
//This is where the caret needs to be.
int dot = jftf.getCaret().getDot();
SwingUtilities.invokeLater( new Runnable() {
public void run() {
'the textField that has focus'.setCaretPosition('Some how get the evt or dot');
}
});
}
public void focusLost (FocusEvent evt) {}
});
I've tried a number of things to get his to work. I've tried using the final keyword, which works, but only for a single textfield.
I've used set/get methods inside the focus listener to assign the current object, but am not sure about how to make this "safe" (e.g. do they need to be synchronized?).
Maybe there is something I am missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您需要使用鼠标监听器:
You need to use a MouseListener:
这实际上发生在
AbstractFormatter.install(JFormattedTextField)
中,当字段获得焦点时调用它。我不确定为什么它是这样设计的,但您可以覆盖此行为(只要您的格式化程序不更改字段中字符串的长度。)
示例(假设字段值是
int< /code>):
请注意,这与默认的
Integer
格式化程序不同。默认格式化程序使用DecimalFormat
来分隔数字组,例如"1,000,000"
。这使得任务变得更加困难,因为它改变了字符串的长度。This actually happens in
AbstractFormatter.install(JFormattedTextField)
, which is called when the field gains focus.I'm not sure why it is designed this way, but you can override this behaviour (as long as your formatter does not change the length of the string in the field.)
Example (assuming the field value is an
int
):Note that this is not the same as the default
Integer
formatter. The default formatter uses aDecimalFormat
that separates groups of digits, e.g."1,000,000"
. This makes the task harder as it changes the length of the string.我认为对 finnw 的解决方案进行了一些改进。例子:
Improved on finnw's solution a bit I think. Example:
如果您不能或不想覆盖格式化程序:
If you cannot or do not want to override the Formatter: