我有很多不同的JFormattedTextFields,包含action和keylisteners。每个Field都有一个keylistener,所以当我按下回车时,我将关注下一个JFormattedTextField。问题是,对于一些JFormattedTextFields,我的代码正在格式化输入,然后将文本设置为new,而对于那些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();
}
}
});
EDIT2: 问题似乎是当我创建JFormattedTextFields时。 当我不在构造函数中使用值创建它时,它可以工作。 但我必须这样做。
答案 0 :(得分:1)
在移动到下一个文本字段之前,您应该考虑处理当前关注的文本字段的所有必需条件,这当然包括提供给该字段的值或文本的格式。满足所有所需条件后,转到下一个文本字段。
实际上,这可以通过针对您的特定情况的keyPressed事件来完成。您不需要在任何文本字段上使用actionPerformed事件,例如:
com.example.hello
这是一个简单的方法,以消除重复代码的需要:
a.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
checkConditions(a, b);
}
}
});
b.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
checkConditions(b, c);
}
}
});
//---------- and so on -------------
如果您希望第一个文本字段的内容在其上建立焦点后立即突出显示(选项卡或单击),则考虑对该组件或您希望相同的任何其他组件使用FocusGained事件效果。
我希望这在某种程度上有所帮助。
<强> EDITED!强>
以便处理OP的特定情况。
答案 1 :(得分:0)
String str=this.getText();
this.setText(str);
this.selectAll();