为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人2483693 2023-03-09 14:37:35
我正在用 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);    }}这是因为文本字段是可编辑的。如果您能帮助我,告诉我如何修复它或如何更改代码中的系统声音,或者您认为可以帮助我的任何事情,我将不胜感激。
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

即使 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。而是设置文本组件的属性


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信