2015-09-17 127 views
1

我知道這已被問及答覆很多次,但我仍然無法得到我真正需要的答案。希望這次有人能幫助我,我提前感謝你。 :)允許文本字段只輸入數字[Java]

這是我想在我的程序中,我想限制用戶輸入數字。每當他們輸入字母和其他字母時,都會有提示信息。我可以做到這一點,有一個提示信件和其他字符,但輸入的值仍然存在,我希望它被清除。

請參閱我的代碼。

private void txtQty1KeyTyped(java.awt.event.KeyEvent evt) {         
    txtQty1.addKeyListener(new KeyAdapter() {}); 
    char char_input = evt.getKeyChar(); 
    if (((char_input < '0') || (char_input > '9')) && (char_input != '\b')) 
    { 
     JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE); 
     txtQty1.setText(" "); 
    } 

}  

雖然我清除我的文本字段,但我輸入的字符仍然出現。 任何幫助將不勝感激。謝謝! :)在如下代碼

+1

evt.consume();應該這樣做:http://docs.oracle.com/javase/7/docs/api/java/awt/event/InputEvent.html#consume() – Stultuske

+0

使用'DocumentFilter'如下所示:http:// stackoverflow .COM /問題/ 32566597/JComboBox中,其中,接受隻字母表/ 32572747#32572747。 OP使用工作過濾器更新了問題。 – camickr

回答

3

您需要創建的DocumentFilter類的子類,並使用正則表達式插入每個字符串/字符相匹配,如果他們是數字或不併相應地執行操作。

下面是一個完整的工作示例代碼。感謝@camickr指出,使用DocumentFilter比使用擴展JTextField來實現相同結果的舊方法更新穎。

import java.awt.BorderLayout; 
import java.util.regex.Pattern; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class TestDocumentFilter { 

    public static void main(String... args) { 
     new TestDocumentFilter(); 
    } 

    public TestDocumentFilter() { 
     JTextField textField = new JTextField(10); 
     ((AbstractDocument) textField.getDocument()).setDocumentFilter(new CustomDocumentFilter()); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new BorderLayout(5, 5)); 
     frame.getContentPane().add(textField, BorderLayout.NORTH); 
     frame.setSize(400, 200); 
     frame.setVisible(true); 
    } 

    private class CustomDocumentFilter extends DocumentFilter { 

     private Pattern regexCheck = Pattern.compile("[0-9]+"); 

     @Override 
     public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException { 
      if (str == null) { 
       return; 
      } 

      if (regexCheck.matcher(str).matches()) { 
       super.insertString(fb, offs, str, a); 
      } 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs) 
       throws BadLocationException { 
      if (str == null) { 
       return; 
      } 

      if (regexCheck.matcher(str).matches()) { 
       fb.replace(offset, length, str, attrs); 
      } 
     } 
    } 
} 
+0

嗨@George_h謝謝你的回答。 :) – nhix

+1

較新的方法是使用'DocumentFilter'而不是創建自定義文檔。 'DocumentFilter'可以添加到任何'AbstractDocument'中。 – camickr

+0

@camickr哦,這對我來說是新的,謝謝。我會嘗試。確實,我很久以前就習慣使用自定義jtextfield :) –

1

加線evt.consume()

JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE); 
txtQty1.setText(" "); 
evt.consume(); //consume the key type event 

詳細討論http://docs.oracle.com/javase/7/docs/api/java/awt/event/InputEvent.html#consume()


要禁用也粘貼在txtQty1文本字段中輸入錯誤您可以按照以下使用caretUpdate事件:

注意:如果您使用Netbean s的GUI形式只是創建caretUpdate事件。

private void txtQty1CaretUpdate(javax.swing.event.CaretEvent evt) {          

    String text = txtQty1.getText(); 
    if(text != null) { 
     if(!text.matches("[0-9]*")) { 
      txtQty1.setText(" ");     
     } 
    } 

} 
+0

嗨@developerbhuwan,非常感謝。我有我需要的。 :) – nhix

+0

@nhix,不要使用KeyListener。這不是解決問題的方法。例如,嘗試將一串無效文本粘貼到文本字段中。你的編輯不起作用。 – camickr

+0

@camickr謝謝!我試過了,你是對的。我應該使用什麼事件? – nhix

相關問題