2012-08-06 37 views
1

正在處理我的第一個程序。我想出瞭如何識別我不想輸入的字符。我想知道如何刪除最後輸入的字符,以便從用戶perspectvive它將顯示爲只能輸入數字。如果無效,刪除JTextField中的最後一次擊鍵

@Override 
public void keyPressed(KeyEvent e) { 
    char keyChar = e.getKeyChar();; 
    char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`[email protected]#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray(); 
     for (int i = 0; i < badCharArray.length; i++) { 
      if (badCharArray[i] == keyChar) { 
       System.out.print(badCharArray[i] + " bad\n"); 
       hourlyWageInput.setBackground(Color.RED); 
       } 
      } 
     } 

謝謝。 enter image description here

+0

e.Consume()會阻止它被傳遞到文本字段,但那麼沒有理由將其變成紅色...... – 2012-08-06 22:22:45

回答

0

這裏更多的信息,DocumentFilter是JTextField的創作:

hourlyWageInput = new JTextField("7.25"); 
DocumentFilter filter = new UppercaseDocumentFilter(); 
((AbstractDocument) hourlyWageInput.getDocument()).setDocumentFilter(filter); 
hourlyWageInput.setHorizontalAlignment(JTextField.CENTER); 
add(hourlyWageInput); 

這裏是我的DocumentFilter:

import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class UppercaseDocumentFilter extends DocumentFilter { 

    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, 
      String text, javax.swing.text.AttributeSet attr) 

      throws BadLocationException { 
       fb.insertString(offset, text.replaceAll("\\D", ""), attr); 
    } 
} 

這工程,自動刪除JTextField中的所有字母和字符。所以謝謝你,這是最好的。

但是,我想知道是否有人知道一個地方的所有命令類似於「\ D」。我花了一段時間才找到正確的信息。

另外,我現在的代碼也可以防止。從我在與雙打工作時需要的類型中選擇。有任何想法嗎?

感謝所有的幫助,它的驚人的今天我學到了多少。一直編碼13個小時。

4

最簡單的方法是使用JFormattedTextField而不是JTextField。

NumberFormat format = NumberFormat.getNumberInstance(); 
format.setMinimumFractionDigits(2); // eventually maximum fraction digits 

JFormattedTextField fld = new JFormattedTextField(format); 
1

只需設置它的文本是當前文本,不將文字插入位置


@Override 
    public void keyReleased(KeyEvent paramKeyEvent) { 
     char keyChar = paramKeyEvent.getKeyChar(); 
     char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`[email protected]#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray(); 
      for (int i = 0; i < badCharArray.length; i++) { 
       if (badCharArray[i] == keyChar) { 
        int caret = field.getCaretPosition()-1; 
        System.out.print(badCharArray[i] + " bad\n"); 
        field.setText(field.getText().substring(0, caret) + 
          field.getText().substring(caret+1)); 
        field.setCaretPosition(caret); 
        } 
      } 
    } 

拿出其設置爲紅色,因爲如果你要自動前 - 修正它,在那裏沒有點(可能設置它顯示紅色一秒?)


其實,唯一的問題與th在於如果他們持有無效的密鑰,它只會刪除最後一個;下面應該工作好了很多,並不會轉移插入符號:P

 boolean held = false; 
     private int oldCaret = 1; 
     @Override 
     public void keyPressed(KeyEvent e) { 
      if(! held) { 
       oldCaret=field.getCaretPosition(); 
       System.out.println(oldCaret); 
      } 
      held = true; 

     } 
     @Override 
     public void keyReleased(KeyEvent paramKeyEvent) { 
      char keyChar = paramKeyEvent.getKeyChar(); 
      char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`[email protected]#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray(); 
      for (int i = 0; i < badCharArray.length; i++) { 
       if(field.getText().contains(badCharArray[i]+"")) { 
        field.setText(field.getText().replace(badCharArray[i]+"", "")); 
        field.setCaretPosition(oldCaret); 
       } 
      } 

      held=false; 
     } 
+0

你能舉個例子嗎? – 2012-08-06 22:18:33

+0

@DavidTunnell查看編輯 – 2012-08-06 22:23:43

+0

@DavidTunnell:這不是正確的答案,並且你不想使用KeyListener。根據MadProgrammer的回答,正確和更健壯的答案是使用DocumentFilter。它可以處理複製和粘貼以及其他非鍵盤輸入。 – 2012-08-06 22:54:08

4

,應避免在這種情況下keyListener秒。如果用戶將文本粘貼到字段中,會發生什麼情況。 keyListener將不會被通知,允許插入無效字符。

你最好使用DocumentFilter來過濾掉你不想要的任何無效字符。

Implementing a DocumentFilter看看對於一些很好的例子

+0

關鍵偵聽器確實檢測到ctrl + v,但是,如果他添加了右鍵單擊菜單,是的,它會在那裏失敗,但默認情況下不在JTextField上。 – 2012-08-06 22:53:52

+0

@Alex:這是迄今爲止較好的答案。 1+。 DocumentFilters將允許修改輸入的數據*之前*顯示,在它被驗證之前。 – 2012-08-06 22:54:39

+0

@HovercraftFullOfEels是的,我剛剛說過,這會失敗的某種情況下(他沒有);但是,我的99%的時間仍然會工作。沒有必要downvote它... – 2012-08-06 22:55:55

相關問題