sno*_*yak 1 java swing short adapter jtextfield
下面是KeyAdapter我试图只接受小于65535的值.看起来好像它实际应该在它后面的一个击键.例如,如果我输入"55",System.out.println将产生"5",执行"3298"将产生"329"等.
// Allows for unsigned short values only
KeyAdapter unsignedShortAdapter = new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
int tempInt = 0;
JTextField temp = null;
if (!((Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
getToolkit().beep();
e.consume();
}
try {
temp = (JTextField) e.getSource();
System.out.println(temp.getText());
tempInt = (Integer.parseInt(temp.getText().toString()));
} catch (NumberFormatException e1) {
} finally {
if (tempInt > (Short.MAX_VALUE * 2)) {
getToolkit().beep();
e.consume();
temp.setText(temp.getText().substring(0, temp.getText().length() - 1));
invalidate();
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
所以,KeyListener你找到的不是一个不可靠的东西,而且会造成许多令人讨厌的副作用(以及可能的文件突变异常:P),我们应该使用a DocumentFilter,因为它是为它设计的
public class ShortFilter extends DocumentFilter {
protected boolean valid(String text) {
boolean valid = true;
for (char check : text.toCharArray()) {
if (!Character.isDigit(check)) {
valid = false;
break;
}
}
if (valid) {
int iValue = Integer.parseInt(text);
valid = iValue <= (Short.MAX_VALUE * 2);
}
return valid;
}
@Override
public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.insert(offset, text);
if (valid(sb.toString())) {
super.insertString(fb, offset, text, attr);
}
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
if (length > 0) {
StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.delete(offset, length);
sb.insert(offset, text);
if (valid(sb.toString())) {
super.replace(fb, offset, length, text, attrs);
}
} else {
insertString(fb, offset, text, attrs);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要将其应用于该字段的文档
((AbstractDocument) field.getDocument()).setDocumentFilter(new ShortFilter());
Run Code Online (Sandbox Code Playgroud)
我退房了
有关更多信息
更新为十进制包含
基本上,如果要允许包含小数,则需要允许valid方法中的字符.
您还需要检查当前文档的内容
StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
// Update the StringBuilder as per noraml
// Check valid as per normal
if (text.contains(".") && sb.contains(".")) {
// already have decimal place
} else {
// Business as usual...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |