不可编辑的 jTextField 在按删除键时发出错误声音,如何解决?

我正在用 java 做一个计算器,以便于制作,并且不要将文档过滤器放在 jtextfield 中。我选择使 jtextfield 不可编辑并添加一个按键侦听器,但是当您按下删除按钮时,它会发出错误声音。


我去配置中更改系统的声音,我已经更改了系统的声音,我发现它是由“预定bip”发出的声音,并发出“Windows 背景”的声音。我可以更改我的选项并且不听声音,但我希望这款游戏可以在互联网上下载。


这是一个简单的示例:如果您在文本字段中按下删除键,它将发出声音:


public Example() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        setBounds(0, 0,250,200);

        setLayout(null);

        javax.swing.JTextField jTextField1 = new javax.swing.JTextField();

        jTextField1.setEditable(false);

        jTextField1.setBounds(30,50,180,60);

        add(jTextField1);

    }

    public static void main(String args[]) {

        Example a = new Example();

        a.setVisible(true);

    }

}

在该代码中,文本字段不可编辑,在下一个代码中,文本字段不会发出声音:


    public Example() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        setBounds(0, 0,250,200);

        setLayout(null);

        javax.swing.JTextField jTextField1 = new javax.swing.JTextField();

        jTextField1.setEditable(true);

        jTextField1.setBounds(30,50,180,60);

        add(jTextField1);

    }

    public static void main(String args[]) {

        Example a = new Example();

        a.setVisible(true);

    }

}

这是因为文本字段是可编辑的。


如果您能帮助我,告诉我如何修复它或如何更改代码中的系统声音,或者您认为可以帮助我的任何事情,我将不胜感激。


慕码人2483693
浏览 86回答 1
1回答

元芳怎么了

即使 JTextField 是可编辑的,您通过按 del 键得到的声音也会出现,并且是对按下的键的操作系统相关的响应。解决这个问题的方法是防止 del 键注册它已被按下,而做到这一点的方法是使用键绑定使 del 键在 GUI 中没有响应——给出一个不执行任何操作的响应当文本字段具有焦点时按下 del 键。例如:import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import javax.swing.*;@SuppressWarnings("serial")public class Example extends JFrame {    public Example() {        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);        // setBounds(0, 0,250,200);        // setLayout(null);        JPanel panel = new JPanel();        int gap = 40;        panel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));        JTextField jTextField1 = new JTextField(20);        jTextField1.setEditable(false);        panel.add(jTextField1);        // get input and action maps to do key binding        InputMap inputMap = jTextField1.getInputMap(JComponent.WHEN_FOCUSED);        ActionMap actionMap = jTextField1.getActionMap();        // the key stroke that we want to change bindings on: delete key        KeyStroke delKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);        // tell the input map to map the key stroke to a String of our choosing        inputMap.put(delKeyStroke, delKeyStroke.toString());        // map this same key String to an action that does **nothing**        actionMap.put(delKeyStroke.toString(), new AbstractAction() {            @Override            public void actionPerformed(ActionEvent e) {                // do nothing            }        });        add(panel);    }    public static void main(String args[]) {        SwingUtilities.invokeLater(() -> {            Example example = new Example();            example.pack();            example.setLocationRelativeTo(null);            example.setVisible(true);        });    }}侧面建议:避免将 KeyListeners 与文本组件一起使用,因为这会导致不希望的和不标准的行为。请改用 DocumentListeners 和 DocumentFilters。避免设置文本组件的边界,因为这也会导致不希望的和非标准的行为,尤其是对于放置在 JScrollPanes 中时不显示滚动条的 JTextAreas。而是设置文本组件的属性
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java