2015-11-07 55 views
1

我使用Key Listener來讀取來自用戶的輸入,但我有一個問題。首先我讀到JTextField「請輸入你的名字」。如果用戶輸入一個名稱,例如John,它將變爲John。但是,如果用戶輸入無效字符,例如「7」我想寫「請輸入您的姓名」,但其寫入「請輸入您的name7」。它正在進行,直到給出正確的輸入。我如何糾正它們?Java KeyListener控件

public void keyTyped(KeyEvent e) { 
       int ascii = (int)e.getKeyChar(); 
       if((ascii >= 65 && ascii <=122) || (ascii <= 351 && ascii >= 199)){ 
        if(TextField1.getText().equals("Please enter your name")) 
         TextField1.setText(""); 
       } 
       else 
        TextField1.setText("Please enter your name"); 
      } 

回答

2

變量名不應該與一個大寫字符開始。

if((ascii >= 65 && ascii <=122) || (ascii <= 351 && ascii >= 199)){ 

請勿使用幻數。如果您正在檢查小寫字母或大寫字母字符,請使用Character類中的方法,如isLetter(...)

不要使用KeyListener,它是舊的API。 Swing更新更好的API。例如,如果將文本粘貼到文本字段,則您的邏輯將不起作用。在輸入文本時使用JFormattedTextFieldDocumentFilter檢查有效數據。有關更多信息,請參見How to Write a Document FilterHow to Use Text Fields上的Swing教程部分。

我不建議在提示的文本字段中放置文本。對於不同的方法檢查出Text Prompt

但它寫道「請輸入您的姓名7」。

發生這種情況的原因是因爲keyTyped事件是在用輸入文本更新文檔之前生成的。要最後執行setText()方法,可以將該語句包裝在SwingUtiltities.invokeLater(...)中。

對於上面給出的所有原因,我不建議採用這種方法。

+0

感謝您的幫助:)我幾乎在編程時睡着了,所以我錯過了規則。我新的Windows窗體應用程序,所以即時瞭解他們:)我改變jtextfield格式化字段。明天我會繼續。非常感謝 – Berkin

2

切勿對JTextComponent(如JTextArea)使用KeyListener。相反,一種選擇是使用已添加到組件文檔中的DocumentListener或DocumentFilter。如果您想完全防止用戶輸入無效字符,那麼Doc​​umentFilter可以正常工作。另一種選擇是將InputVerifier附加到用戶嘗試離開文本組件時啓動的組件。

例如

import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import javax.swing.*; 
import javax.swing.text.JTextComponent; 

@SuppressWarnings("serial") 
public class MyTextField extends JPanel { 
    private static final String DEFAULT_TEXT = "Please enter your name"; 
    private static final int COLUMNS = 20; 
    private JTextField textField = new JTextField(DEFAULT_TEXT, COLUMNS); 

    public MyTextField() { 
     add(new JLabel("Name:")); 
     add(textField); 
     add(new JButton("Submit")); 

     textField.addFocusListener(new TextFocusListener()); 
     textField.setInputVerifier(new MyInputVerfier()); 
    } 

    private class TextFocusListener extends FocusAdapter { 
     @Override 
     public void focusGained(FocusEvent e) { 
      JTextComponent textComp = (JTextComponent) e.getComponent(); 
      if (textComp != null) { 
       textComp.selectAll(); // so can change all text 
      } 
      super.focusGained(e); 
     } 
    } 

    private class MyInputVerfier extends InputVerifier { 

     @Override 
     public boolean verify(JComponent input) { 
      String text = ((JTextComponent) input).getText(); 
      if (!text.replaceAll("\\d", "").equals(text)) { 
       return false; 
      } 
      return true; 
     } 

     @Override 
     public boolean shouldYieldFocus(JComponent input) { 
      if (!verify(input)) { 
       JTextComponent textComp = (JTextComponent) input; 
       textComp.setText(DEFAULT_TEXT); 
       textComp.selectAll(); 
       return false; 
      } 
      return super.shouldYieldFocus(input); 
     } 

    } 

    private static void createAndShowGui() { 
     MyTextField mainPanel = new MyTextField(); 

     JFrame frame = new JFrame("MyTextField"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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