概要

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

サンプルコード

String key = DefaultEditorKit.deletePrevCharAction; // delete-previous
Action deletePreviousAction = am.get(key);
am.put(key, new TextAction(key) {
  // @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 = DefaultEditorKit.deleteNextCharAction; // delete-next
Action deleteNextAction = am.get(key);
am.put(key, new TextAction(key) {
  // @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() == dot) {
        return;
      }
    }
    deleteNextAction.actionPerformed(e);
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTextFieldBeep音の設定を以下2点変更して動作テストを行っています。

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

参考リンク

コメント