2016-11-06 56 views
-3

那麼,我正在開發一個需要用戶輸入的java項目。我意識到,如果用戶在字段中沒有字符時按下退格鍵,則會聽到窗口警告聲。我怎樣才能阻止這個請。如果在不同平臺上的行爲可能不同,我的系統是Windows 10。謝謝。空jtextfield/jpassword刪除聲音

+0

感謝。這給了我足夠的暗示來解決問題。非常感謝。 – user7121782

+0

在答案解決你的問題,一定要接受它。訪問[接受答案如何工作?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)瞭解更多,並確保接受答案。謝謝! –

回答

2

行爲在不同平臺上可能會有所不同。

是的,行爲可以是不同的,因爲它是由LAF控制的,所以你不應該改變它。

但要理解Swing的工作原理,您需要了解Swing使用DefaultEditorKit提供的Action來提供文本組件的編輯功能。

以下爲當前的「刪除前一個字符」行動的代碼(從DefaultEditKit拍攝):

/* 
* Deletes the character of content that precedes the 
* current caret position. 
* @see DefaultEditorKit#deletePrevCharAction 
* @see DefaultEditorKit#getActions 
*/ 
static class DeletePrevCharAction extends TextAction { 

    /** 
    * Creates this object with the appropriate identifier. 
    */ 
    DeletePrevCharAction() { 
     super(DefaultEditorKit.deletePrevCharAction); 
    } 

    /** 
    * The operation to perform when this action is triggered. 
    * 
    * @param e the action event 
    */ 
    public void actionPerformed(ActionEvent e) { 
     JTextComponent target = getTextComponent(e); 
     boolean beep = true; 
     if ((target != null) && (target.isEditable())) { 
      try { 
       Document doc = target.getDocument(); 
       Caret caret = target.getCaret(); 
       int dot = caret.getDot(); 
       int mark = caret.getMark(); 
       if (dot != mark) { 
        doc.remove(Math.min(dot, mark), Math.abs(dot - mark)); 
        beep = false; 
       } else if (dot > 0) { 
        int delChars = 1; 

        if (dot > 1) { 
         String dotChars = doc.getText(dot - 2, 2); 
         char c0 = dotChars.charAt(0); 
         char c1 = dotChars.charAt(1); 

         if (c0 >= '\uD800' && c0 <= '\uDBFF' && 
          c1 >= '\uDC00' && c1 <= '\uDFFF') { 
          delChars = 2; 
         } 
        } 

        doc.remove(dot - delChars, delChars); 
        beep = false; 
       } 
      } catch (BadLocationException bl) { 
      } 
     } 
     if (beep) { 
      UIManager.getLookAndFeel().provideErrorFeedback(target); 
     } 
    } 
} 

如果你不喜歡的嗶嗶聲,那麼你就需要創建自己的自定義操作消除嘟嘟聲。 (即不提供錯誤反饋)。一旦你自定義操作,您可以使用不是改變單一的文本字段:

textField.getActionMap().put(DefaultEditorKit.deletePrevCharAction, new MyDeletePrevCharAction()); 

,也可以使用更改所有文本字段:

ActionMap am = (ActionMap)UIManager.get("TextField.actionMap"); 
am.put(DefaultEditorKit.deletePrevCharAction, new MyDeletePrevCharAction());