在 JFormattedTextField 中禁用哔声

Posted

技术标签:

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

我想,但我有一些限制。

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

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

【问题讨论】:

你试过这个问题的第二个答案吗? ***.com/questions/13427174/… 【参考方案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 动作也会完全禁用。

【讨论】:

以上是关于在 JFormattedTextField 中禁用哔声的主要内容,如果未能解决你的问题,请参考以下文章

JFormattedTextField 仅返回默认值

具有任意小数位数的 JFormattedTextfield

如何从 JformattedTextfield 检索货币格式值

JFormattedTextField 问题

Double的JFormattedTextField仍然需要字符[重复]

如何从另一个 java 类中的 jTextField 或 jFormattedTextField 获取数据