TITLE:JTextFieldでのBeep音の設定を変更する

Posted by aterai at 2012-10-01

JTextFieldでのBeep音の設定を変更する

JTextFieldなどで、DELETE、BACK_SPACEキーを押した時に鳴らすBeep音の設定を変更します。

  • &jnlp;
  • &jar;
  • &zip;
DeleteKeyBeep.png

サンプルコード

String key = "delete-previous";
final Action deletePreviousAction = am.get(key);
am.put(key, new TextAction(DefaultEditorKit.deletePrevCharAction) {
  //@see javax/swing/text/DefaultEditorKit.java DeletePrevCharAction
  @Override public void actionPerformed(ActionEvent e) {
    JTextComponent target = getTextComponent(e);
    if(target != null && target.isEditable()) {
      Caret caret = target.getCaret();
      int dot = caret.getDot();
      int mark = caret.getMark();
      if(dot==0 && mark==0) {
        return;
      }
    }
    deletePreviousAction.actionPerformed(e);
  }
});
key = "delete-next";
final Action deleteNextAction = am.get(key);
am.put(key, new TextAction(DefaultEditorKit.deleteNextCharAction) {
  //@see javax/swing/text/DefaultEditorKit.java DeleteNextCharAction
  @Override public void actionPerformed(ActionEvent e) {
    JTextComponent target = getTextComponent(e);
    if(target != null && target.isEditable()) {
      Document doc = target.getDocument();
      Caret caret = target.getCaret();
      int dot = caret.getDot();
      int mark = caret.getMark();
      if(dot==mark && doc.getLength()==0 || doc.getLength()==dot) {
        return;
      }
    }
    deleteNextAction.actionPerformed(e);
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、以下の二点を変更して、Beep音の設定を変更しています。

  • TextAction(DefaultEditorKit.deleteNextCharAction)#actionPerformed(ActionEvent) などをオーバーライドして、DELETEキーやBACK_SPACEキーで文字の削除がなくても、Beep音を鳴らさないように変更したアクションをActionMapに設定
  • 5文字以上入力できないように制限し、超える場合はBeep音を鳴らすDocumentFilterを作成して、AbstractDocument#setDocumentFilter(DocumentFilter) で設定

参考リンク

コメント