在 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());
【讨论】:
我想禁用无效输入的哔声(主要是)和任何其他可能导致哔声的操作。如果我按照您的方式进行操作,是否需要为每个无效输入执行操作?这将是很多代码...... @user2628641I 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 检索货币格式值