【问题标题】:disable beep sound in JFormattedTextField在 JFormattedTextField 中禁用哔声
【发布时间】:2014-07-02 14:08:48
【问题描述】:

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

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

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

【问题讨论】:

标签: java swing jformattedtextfield


【解决方案1】:

我想在 JFormattedTextField 中禁用哔声,

不是很具体。您试图禁用“哔”的操作是什么?例如,我知道在文本字段中,当您按下退格键时您会听到“哔”声,并且您已经在文本字段的开头。

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

因此,如果您想禁用“哔”声,则需要自定义操作。下面我复制了(从 DefaultEditorKit 中)用于删除文本组件中的字符的操作。我做了一些更改以禁用哔声:

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());

【讨论】:

  • 我想禁用无效输入的哔声(主要是)和任何其他可能导致哔声的操作。如果我按照您的方式进行操作,是否需要为每个无效输入执行操作?这将是很多代码......
  • @user2628641 I want to disable the beep for invalid input(mainly) - 我认为您需要查看DefaultEditorKit.InsertContentAction。我不知道您可能需要覆盖哪些其他操作。
【解决方案2】:

您应该能够使用在此问题上提出的相同解决方案禁用它:Disable beep when backspace is pressed in an empty JTextField

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2012-05-19
    • 2013-12-12
    • 1970-01-01
    • 2018-08-11
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多