2014-01-07 45 views
1

我想使一個JTextField只允許數字輸入,只允許兩個字符(換句話說只允許數字0-99)。我已經看過一些教程,並試圖將輸入限制到目前爲止只有數字。 迄今爲止,我的代碼存在的問題是接受所有的鍵輸入。我嘗試反轉大於和小於符號,並停止接受任何輸入。我相信問題出在關鍵字符代碼上,但有些幫助會很好,因爲我找不到任何有用的東西(我看起來每個地方都有不同的Java鍵盤映射)。如何將JTextField輸入限制爲數字和只有2個字符?

if(event.getSource() == txtMasterSound) 
    { 
     if(event.getKeyCode() < 0 || event.getKeyCode() > 9) 
     { 
      System.out.println("Your input was invalid"); 
      event.consume(); 
     } 
     else 
     { 
      System.out.println("Your input was valid"); 
      return; 
     } 
    } 

至於限制角色,我真的不知道從哪裏開始,所以在正確的方向指向一些也就好了。

+3

你確定你不想要JSpinner嗎? –

+0

@KevinWorkman其實這是一個好主意。我忘了他們的一切。 –

回答

6
  1. 使用JFormattedTextField代替
  2. 或者在球場上的文檔,用於過濾非有效輸入使用DocumentFilter
  3. 或使用InputVerifier

例如DoumentFilter

import javax.swing.*; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 
import javax.swing.text.PlainDocument; 

public class MyDocFilter { 
    private static void createAndShowGUI() { 
     JTextField field1 = new JTextField(10); 
     PlainDocument doc = (PlainDocument) field1.getDocument(); 
     doc.setDocumentFilter(new DocumentFilter() { 
     private boolean isValid(String testText) { 
      if (testText.length() > 2) { 
       return false; 
      } 
      if (testText.isEmpty()) { 
       return true; 
      } 
      int intValue = 0; 
      try { 
       intValue = Integer.parseInt(testText.trim()); 
      } catch (NumberFormatException e) { 
       return false; 
      } 
      if (intValue < 0 || intValue > 99) { 
       return false; 
      } 
      return true; 
     } 

     @Override 
     public void insertString(FilterBypass fb, int offset, String text, 
       AttributeSet attr) throws BadLocationException { 
      StringBuilder sb = new StringBuilder(); 
      sb.append(fb.getDocument().getText(0, fb.getDocument().getLength())); 
      sb.insert(offset, text); 
      if (isValid(sb.toString())) { 
       super.insertString(fb, offset, text, attr); 
      } 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int length, 
       String text, AttributeSet attrs) throws BadLocationException { 
      StringBuilder sb = new StringBuilder(); 
      sb.append(fb.getDocument().getText(0, fb.getDocument().getLength())); 
      int end = offset + length; 
      sb.replace(offset, end, text); 
      if (isValid(sb.toString())) { 
       super.replace(fb, offset, length, text, attrs); 
      } 
     } 

     @Override 
     public void remove(FilterBypass fb, int offset, int length) 
       throws BadLocationException { 
      StringBuilder sb = new StringBuilder(); 
      sb.append(fb.getDocument().getText(0, fb.getDocument().getLength())); 
      int end = offset + length; 
      sb.delete(offset, end); 
      if (isValid(sb.toString())) { 
       super.remove(fb, offset, length); 
      } 
     } 
     }); 


     JPanel panel = new JPanel(); 
     panel.add(field1); 

     JFrame frame = new JFrame("MyDocFilter"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
     }); 
    } 
} 
+0

爲什麼重寫'DocumentFilter.remove(FilterBypass,int,int)'?這不是多餘的嗎? – user1257

-1

這可能是一個有點草率,但你可能會增加檢測的變化(當一些鍵入)的監聽器,每次東西鍵入你檢查什麼鍵入,如果不是0-9,則刪除最後一個字符,如果超過2個字符,則刪除多餘的字符。

這可能會工作(我還沒有嘗試過),但我認爲JFormattedTextField更專業。

+1

這不會很好地工作,因爲它很可能會在您的偵聽器更新它之前呈現。 – Obicere

+0

當有人試圖使用複製粘貼將文本粘貼到JTextBox時,您的建議將失敗。你真的不想這樣做。 –

+0

@Obicere是的,你可能是對的,這就是爲什麼我說它是馬虎,但它可能會做它的工作。您也可以在提交字符串時進行檢查。 – gumba