2011-11-29 43 views
3

我想使文本字段只接受來自用戶的數字和退格按鈕。如何忽略Swing中的按鍵事件?

我已經添加了用於檢查用戶鍵碼的功能,但是如果鍵碼不是數字,我不知道如何停止按鍵事件。

我需要添加什麼代碼才能停止事件?

private void jTextField2KeyPressed(java.awt.event.KeyEvent evt) 
{          

    if(!((evt.getKeyCode()==8) || (evt.getKeyCode()>48 && evt.getKeyCode()<57))) 
    { 
     //how to stop the key pressed event 
    } 
} 
+0

我試試evt.consume();並返回;停止事件,但不工作 –

+0

我誠實的第一反應:爲什麼沒有人似乎記得一個偉大的發明?搜索引擎!谷歌搜索會給你一個合適的解決方案,毫無疑問... – Andy

回答

-2

Limit TextField input to numeric value - 我認爲這是你在尋找什麼。

我認爲你的代碼不起作用的原因是因爲if語句不正確,實際上並沒有捕獲非數字鍵代碼。雖然,我不確定,因爲我沒有親眼看到或測試過你的代碼,所以如果你真的想做一些調試,但說實話,這裏發佈的解決方案將是最簡單的。

+2

-1,這是非常古老的代碼,並寫入AWT不Swing。 Swing對此有更好的支持(請參閱本文中的其他答案)。該代碼也不適用於粘貼文本。 – camickr

4

嘗試重寫keyTyped

@Override 
public void keyTyped(KeyEvent evt) { 
    if (!Character.isDigit(evt.getKeyChar()) && !(evt.getKeyCode() == KeyEvent.VK_BACK_SPACE)) { 
     evt.consume(); 
    } 
} 

更新:

在你想要粘貼到不行,並執行輸入情況下鍵入,您可以使用下面的。

@Override 
public void keyPressed(KeyEvent evt) { 
    if(evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_V) { 
     evt.consume(); 
    } 
} 
+0

-1,請勿使用KeyEvents。如果將文本粘貼到文本字段中,這將不起作用。 – camickr

+0

@camickr:謝謝你的提高。 –

2

設置文本字段的PlainDocumentDocumentFilter
樣品:

PlainDocument document = new PlainDocument(); 
    document.setDocumentFilter(new DocumentFilter() { 

     @Override 
     public void insertString(FilterBypass fb, int offset, String text, AttributeSet attrs) throws BadLocationException { 
      fb.insertString(offset, filter(text), attrs); 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
      fb.replace(offset, length, filter(text), attrs); 
     } 

     private String filter(String text) { 
      StringBuilder builder = new StringBuilder(text); 
      for (int i = 0; i < builder.length();) { 
       if (Character.isDigit(builder.charAt(i))) { 
        i += 1; 
       } else { 
        builder.deleteCharAt(i); 
       } 
      } 
      return builder.toString(); 
     } 
    }); 

    JTextField field = new JTextField(document, null, 0); 
+0

+1,在這種情況下,格式化的文本字段可能更簡單,但對於DocumentFilter總是很熟悉。 – camickr

0

我建議你看,如果你可以消耗的keyPressed,調用keyReleased,以及事件的keyTyped,看看他們是否阻止鑰匙到達您的程序。

你的程序可能只是尋找1種類型的關鍵事件,但你需要找出它是哪一個,並消耗這些事件。