我想在JFormattedTextField中禁用哔声,但我有一些限制。
我只能访问JFormattedTextField实例。我无法创建新的子类
我无法更改系统设置。程序的其他部分可能需要发出哔声
答案 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操作。