我最近遇到了和4年前这个家伙一样的问题。他在那里得到了一些答案,但对他和我都不起作用,然后这个问题就不再更新了。如何从JTextField获得字符串并将其保存在变量中?
关键是检查textfield中输入的内容,如果textfield中还有小数点,则使用事件,不允许添加第二个小数点。
我发现的主要问题是我需要在键事件中添加this
,如下所示。但是事件内部的this.
语句引用事件本身,而不是JTextField。所以我需要找到绕过或其他解决方案如何编写getText语句
String text = this.getText().toString();
如果有人有关于如何改进代码的想法,我也愿意接受任何建议,除了将其重写为格式化字段,因为用户体验与我尝试格式化字段的时候有点不同。
public class TxtfNumber extends JTextField {
String text = this.getText().toString();
public TxtfNumber(){
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent evt) {
switch (evt.getID()) {
case KeyEvent.KEY_TYPED:
String text = this.getText().toString();
if(evt.getKeyChar()=='.'&& text.contains(".")){
evt.consume();
}
}
return false;
}
});
}
}
SOLUTION
当我使用lambda表达式时,我意外地在解决方案中运行。您需要使用的公式是类名,然后是.this
。在本例中,
String text = TxtfNumber.this.getText().toString();
是解决方案。
但最终,当我知道如何实现JTextField
时,我不再需要字符串解决方案。所以我在这里给出了整个代码供以后使用。可以随意使用它作为选择Bean组件。
它限制用户只能在文本开头使用一个减号,在任何地方使用一个小数点,然后键入两个十进制数。
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.JTextField;
public class TxtfNumber extends JTextField {
public TxtfNumber(){
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent evt) {
switch (evt.getID()) {
case KeyEvent.KEY_TYPED:
//restricts input charactes
if(!Character.isDigit(evt.getKeyChar()) && (evt.getKeyChar()!='.') && (evt.getKeyChar()!='-') && (evt.getKeyChar()!=','))
evt.consume();
//change , and . for securing of different keyboard language
if (evt.getKeyChar()==',')
evt.setKeyChar('.');
//allow only one decimal dot in text
if (evt.getKeyChar()=='.' && TxtfNumber.this.getText().contains("."))
evt.consume();
//allow minus sign only at the start of text
if (evt.getKeyChar()=='-' && TxtfNumber.this.getText().length() != 0)
evt.consume();
//allow two decimal numbers after dot
for (int i = -1; (i = TxtfNumber.this.getText().indexOf(".", i + 1)) != -1; i++) {
if (i+3 == TxtfNumber.this.getText().length())
evt.consume();
}
break;
}
return false;
}
});
}
};