JFormattedTextfield.selectAll() 在格式化文本时不起作用
JFormattedTextfield.selectAll() does not work when formatting the text
我有很多不同的 JFormattedTextFields,带有操作和键监听器。每个 Field 都有一个 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 但不会 select 文本或值。当我不使用 setText() 时,我没有问题。有人有解决方案吗?
编辑:对于某些 JFormattedTextFields,解决方案是将 selectAll() 添加到 keyAdapter,但不是针对所有的。
例如:
b.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
c.requestFocusInWindow();
c.selectAll();
}
}
});
编辑2:
问题似乎出在我创建 JFormattedTextFields 时。
当我不在构造函数中使用值创建它们时,它会起作用。
但我不得不做。
在移动到下一个文本字段之前,您应该考虑处理当前关注的文本字段的所有必需条件,这当然包括提供给该字段的值或文本的格式。满足所有所需条件后,继续下一个文本字段。
实际上,这一切都可以通过针对您的特定情况的 keyPressed 事件来完成。您的任何文本字段都不需要 actionPerformed 事件,例如:
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 -------------
这里有一个简单的方法来消除重复代码的需要:
private void checkConditions(JFormattedTextField fieldA, JFormattedTextField fieldB) {
// Make sure something is contained within fieldA and
// that it's actually numerical text.
if(!fieldA.getText().isEmpty() &&
fieldA.getText().matches("([-]?)\d+([,]\d+)?(([.]\d+)?)")) {
// Convert the supplied text to Double and
// ensure the desired numerical formating.
String res = (String)tausenderPunkt(Double.parseDouble(fieldA.getText().replace(",","")));
fieldA.setText(res);
// Set Focus to our next text fieldB.
fieldB.requestFocusInWindow();
// Highlight the contents (if any) within the
// next text fieldB.
fieldB.selectAll();
}
// If fieldA is empty or fieldA does not contain
// numerical text then inform User and re-highlight
// the entry in fieldA.
else {
JOptionPane.showMessageDialog (null, "Please Enter Numerical Values Only!",
"Incorrect Entry", JOptionPane.WARNING_MESSAGE);
fieldA.selectAll();
}
}
如果您希望第一个文本字段的内容在获得焦点(切换到或单击)后立即突出显示,请考虑对该组件或您需要的任何其他组件使用 FocusGained 事件同样的效果。
我希望这在某种程度上有所帮助。
已编辑!
为了处理OP的特殊情况。
String str=this.getText();
this.setText(str);
this.selectAll();
我有很多不同的 JFormattedTextFields,带有操作和键监听器。每个 Field 都有一个 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 但不会 select 文本或值。当我不使用 setText() 时,我没有问题。有人有解决方案吗?
编辑:对于某些 JFormattedTextFields,解决方案是将 selectAll() 添加到 keyAdapter,但不是针对所有的。 例如:
b.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
c.requestFocusInWindow();
c.selectAll();
}
}
});
编辑2: 问题似乎出在我创建 JFormattedTextFields 时。 当我不在构造函数中使用值创建它们时,它会起作用。 但我不得不做。
在移动到下一个文本字段之前,您应该考虑处理当前关注的文本字段的所有必需条件,这当然包括提供给该字段的值或文本的格式。满足所有所需条件后,继续下一个文本字段。
实际上,这一切都可以通过针对您的特定情况的 keyPressed 事件来完成。您的任何文本字段都不需要 actionPerformed 事件,例如:
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 -------------
这里有一个简单的方法来消除重复代码的需要:
private void checkConditions(JFormattedTextField fieldA, JFormattedTextField fieldB) {
// Make sure something is contained within fieldA and
// that it's actually numerical text.
if(!fieldA.getText().isEmpty() &&
fieldA.getText().matches("([-]?)\d+([,]\d+)?(([.]\d+)?)")) {
// Convert the supplied text to Double and
// ensure the desired numerical formating.
String res = (String)tausenderPunkt(Double.parseDouble(fieldA.getText().replace(",","")));
fieldA.setText(res);
// Set Focus to our next text fieldB.
fieldB.requestFocusInWindow();
// Highlight the contents (if any) within the
// next text fieldB.
fieldB.selectAll();
}
// If fieldA is empty or fieldA does not contain
// numerical text then inform User and re-highlight
// the entry in fieldA.
else {
JOptionPane.showMessageDialog (null, "Please Enter Numerical Values Only!",
"Incorrect Entry", JOptionPane.WARNING_MESSAGE);
fieldA.selectAll();
}
}
如果您希望第一个文本字段的内容在获得焦点(切换到或单击)后立即突出显示,请考虑对该组件或您需要的任何其他组件使用 FocusGained 事件同样的效果。
我希望这在某种程度上有所帮助。
已编辑!
为了处理OP的特殊情况。
String str=this.getText();
this.setText(str);
this.selectAll();