【发布时间】:2016-02-28 10:03:12
【问题描述】:
我有很多不同的 JFormattedTextFields,带有动作和按键监听器。每个字段都有一个 keylistener,所以当我按下回车键时,我将关注下一个 JFormattedTextField。问题是,对于某些 JFormattedTextFields,我的代码正在格式化输入,然后将文本设置为新的,而对于那些 selectAll() 不起作用。
JFormattedTextField a = new JFormattedTextField(someDouble);
JFormattedTextField b = new JFormattedTextField(someDouble2);
a.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
leasingfaktor1Field.selectAll();
if(...) {
//do something
a.setText(tausenderPunkt(someValue));
}
}
});
a.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
b.requestFocusInWindow();
}
}
});
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
leasingfaktor1Field.selectAll();
if(...) {
//do something
b.setText(tausenderPunkt(someValue));
}
}
});
b.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
c.requestFocusInWindow();
}
}
});
函数tausenderPunkt():
public String tausenderPunkt(double value) {
String s = String.format("%1$,.2f", value);
return s;
}
所以当我的光标在字段 a 中并且我按下回车键时,光标转到字段 b 但不选择文本或值。当我不使用 setText() 时,我没有问题。有人有解决方案吗?
编辑:对于某些 JFormattedTextFields,解决方案是将 selectAll() 添加到 keyAdapter,但不是全部。 例如:
b.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
c.requestFocusInWindow();
c.selectAll();
}
}
});
编辑2: 问题似乎出在我创建 JFormattedTextFields 时。 当我不在构造函数中使用值创建它们时,它可以工作。 但我必须这样做。
【问题讨论】:
-
您是否尝试过切换,即先执行
setText,然后执行selectAll()?您也可以尝试在invokeLater块内执行selectAll -
我无法切换顺序,因为首先程序应该 selectAll() 以便用户可以覆盖该值,然后 setText() 对其进行格式化(例如数字)。我试过invokeLater,但它什么也没做。 mouseAdapter 和 selectAll() 工作正常。
-
每次我遇到这样的场景时,始终有效的解决方案是使用
SwingWorker在后台进行初始化,在方法@987654330@完成后,我使用@ 987654331@方法完成任务。 -
不应该在 AbstractFormatter 中进行格式化吗? docs.oracle.com/javase/7/docs/api/javax/swing/…
标签: java settext jformattedtextfield selectall