在JFormattedTextField中禁用蜂鸣声

时间:2014-07-02 14:08:49

标签: java swing jformattedtextfield

我想在JFormattedTextField中禁用哔声,但我有一些限制。

  1. 我只能访问JFormattedTextField实例。我无法创建新的子类

  2. 我无法更改系统设置。程序的其他部分可能需要发出哔声

2 个答案:

答案 0 :(得分:3)

  

我想在JFormattedTextField中禁用哔声,

不太具体。对于什么动作你试图禁用" beep"?例如,我知道在文本字段中,您将听到" beep"当您按退格按钮并且您已经在文本字段的开头时发出声音。

在这种情况下,文本组件使用键绑定来执行操作。因此退格键调用"后退空间"行动。有关列出所有键绑定的程序,请参阅Key Bindings

所以如果你想禁用" beep"声音然后你需要自定义动作。下面我复制了(从DefaultEditorKit)用于删除文本组件中的字符的Action。我进行了一些更改以禁用蜂鸣声:

static class MyDeletePrevCharAction extends TextAction {

    /**
     * Creates this object with the appropriate identifier.
     */
    MyDeletePrevCharAction() {
       //super(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);
            System.out.println("beep");
        }
    }
}

您可以使用以下方法对特定文本组件使用此操作:

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

答案 1 :(得分:0)

您应该可以使用此问题中提出的相同解决方案来禁用它:Disable beep when backspace is pressed in an empty JTextField

JTextField field = new JTextField();
Action action;
a = field.getActionMap().get(DefaultEditorKit.beepAction);
a.setEnabled(false);

即使目标事件不同,也会针对目标对象完全禁用beed操作。