2012-08-11 62 views
1

下面是我試圖只接受小於65535的值的KeyAdapter。它看起來好像它在它實際應該在的位置後面有一個按鍵。例如,如果我輸入 「55」 後,將的System.out.println產生 「5」,做 「3298」 將產生 「329」 等JTextField只接受有效的無符號短褲? (使用KeyAdapter)

// 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(); 
      } 

     } 
    } 

}; 
+0

你有使用'KeyListener'?因爲有很多更好的解決方案,否則 – MadProgrammer 2012-08-11 22:05:59

+0

不,我不知道。我想用我可以工作的任何東西,哈哈。我只是使用KeyListener來防止用戶輸入非數字字符。 – snotyak 2012-08-11 22:07:26

+0

問題是,在文本字段被更新之前,您正在獲取按鍵,所以當您的文本字段包含「5」並且按下「5」時,當您捕獲擊鍵時,該字段僅包含「5」。 – MadProgrammer 2012-08-11 22:10:29

回答

5

因此,而不是一個KeyListener,你已經找到,是不可靠的,會造成大量的討厭的副作用(以及可能的文檔突變例外:P),我們應該用一個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); 

     } 

    } 
} 

您需要這個申請該領域的文件

((AbstractDocument) field.getDocument()).setDocumentFilter(new ShortFilter()); 

我會找

更多一些信息

更新十進制列入

基本上,如果你想允許包含一個小數,你需要允許在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... 
} 
+0

我會如何去做這個小數值?基本上問我如何將它限制爲一個「。」 – snotyak 2012-08-11 22:50:19

+0

@BackpackOnHead檢查更新,我將一些真正的基本邏輯作爲例子 – MadProgrammer 2012-08-12 03:59:24

+0

是的,謝謝。我自己也做了其他事情。 – snotyak 2012-08-12 06:25:07