我限制JTextFields
仅接受数字。我正在使用以下代码。
// my textboxes
t1=new JTextField(10);
t2=new JTextField(10);
t3=new JTextField(10);
// for the first one
t1.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (!((c >= '0') && (c <= '9') ||
(c == KeyEvent.VK_BACK_SPACE) ||
(c == KeyEvent.VK_DELETE))) {
getToolkit().beep();
e.consume();
}
}
});
假设我有20 texboxes
需要相同的验证检查。那么我们需要写这个代码20次吗?我可以写一个通用的方法来实现它吗?我是Swing
的新手。
答案 0 :(得分:9)
同样,使用DocumentFilter,因为这将处理复制和粘贴,这将允许在文档接受文本之前过滤:
import javax.swing.*;
import javax.swing.text.*;
public class DocListenerEg extends JPanel {
private static final int FIELD_COUNT = 5;
private JTextField[] fields = new JTextField[FIELD_COUNT];
public DocListenerEg() {
MyDocFilter myFilter = new MyDocFilter();
for (int i = 0; i < fields.length; i++) {
fields[i] = new JTextField(5);
((PlainDocument) fields[i].getDocument()).setDocumentFilter(myFilter);
add(fields[i]);
}
}
private class MyDocFilter extends DocumentFilter {
public void insertString(DocumentFilter.FilterBypass fb, int offset,
String text, AttributeSet attr) throws BadLocationException {
for (char c : text.toCharArray()) {
if (!Character.isDigit(c)) {
return;
}
}
fb.insertString(offset, text.toUpperCase(), attr);
}
public void replace(DocumentFilter.FilterBypass fb, int offset,
int length, String text, AttributeSet attrs)
throws BadLocationException {
for (char c : text.toCharArray()) {
if (!Character.isDigit(c)) {
return;
}
}
fb.replace(offset, length, text.toUpperCase(), attrs);
}
}
private static void createAndShowGui() {
DocListenerEg mainPanel = new DocListenerEg();
JFrame frame = new JFrame("DocListenerEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
答案 1 :(得分:4)
答案 2 :(得分:0)
将您的匿名类保存到变量中:
KeyListener keyListener= new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (!((c >= '0') && (c <= '9') ||
(c == KeyEvent.VK_BACK_SPACE) ||
(c == KeyEvent.VK_DELETE))) {
getToolkit().beep();
e.consume();
}
}
}
然后
t1.addKeyListener(keyListener);
t2.addKeyListener(keyListener);
t3.addKeyListener(keyListener);
...
答案 3 :(得分:0)
创建一个名为:
的类<强> NumberOnlyTextField 强>
使其扩展 JTextField ,并在构造函数中添加 addKeyListener (..)代码。你有自己的号码验证文本字段。
答案 4 :(得分:0)
我会创建一个私有布尔方法(如果它只在这个类中使用)或public,如果它在其他地方调用,例如。使用reg ex:
public boolean checkToBeNumberInput(char c, KeyEvent e){
if(!char c.matches("[0-9]")||
(c == KeyEvent.VK_BACK_SPACE) ||
(c == KeyEvent.VK_DELETE))) {
getToolkit().beep();
e.consume();
return false;
}
return true;
}
然后调用此布尔方法,如果它返回true:
if(checkToBeNumberInput()==false){
System.out.println("only numbers are allowed!");
}
这是一个快速的草案,但我希望它可以帮助某人
答案 5 :(得分:0)
//查看事件keypressed 。 : private void montoingresoKeyPressed(java.awt.event.KeyEvent evt) {
if(Character.isLetter(evt.getKeyChar()))
{
//do what you want on this event, when key is pressed named evt
}
}