• category: swing folder: DeleteKeyBeep title: JTextFieldでのBeep音の設定を変更する tags: [JTextField, Beep, ActionMap, DocumentFilter] author: aterai pubdate: 2012-10-01T14:42:41+09:00 description: JTextFieldなどで、DeleteBack Spaceキーを押した時に鳴らすBeep音の設定を変更します。 image: https://lh6.googleusercontent.com/-zIUmkF2C9FA/UGkqdcWDLVI/AAAAAAAABTk/F4nun0GDLZc/s800/DeleteKeyBeep.png

概要

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

サンプルコード

String key = DefaultEditorKit.deletePrevCharAction; //"delete-previous";
final 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";
final 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

解説

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

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

参考リンク

コメント