当前位置: 首页 > 知识库问答 >
问题:

当你按delete键时,一个不可编辑的jTextField会发出错误声音,如何修复?

卜阳
2023-03-14

我在java中做了一个计算器,很容易,不要把文档过滤器放在jtext字段中。我选择了使jtext field不可编辑,并添加了一个按键侦听器,但是当你按下删除按钮时,它会发出错误的声音。

下面是一个简单的例子:如果你按下文本字段中的delete键,它会发出声音:

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个答案

宦正诚
2023-03-14

即使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。
  • 避免设置文本组件的边界,因为这也会导致不希望的和非标准的行为,特别是当JTextArea放置在JScrollPanes中时不显示滚动条。相反,设置文本组件的属性,如列和字体属性。
 类似资料:
  • < br >我有这段代码,其中我设计了一个< code >可编辑的JComboBox来侦听我的< code>keyPressed事件,并显示一条消息,说明键已被按下。但我不知道为什么这没用。作为初学者,我可能在逻辑上/概念上犯了错误。 因此,我想征求关于如何构建代码的建议,以使其工作。 密码

  • 在index.hpp中,我创建了一个具有多个数据成员的类,如、等。我在类外部定义了一个构造函数。在program.cpp中,我创建了一个名为SAM的对象。当我试图编译它时,它显示错误。什么原因? Program.cpp index.hpp 错误信息

  • 如果我按下呼叫按钮,我会得到一个错误,即出租车没有呼叫,而是转到另一个窗口。 我认为这个错误来自实时数据库。如果你有不同的意见,写下你的答案。 错误:E/AndroidRuntime:致命异常:主进程:com。实例乌兹别克斯坦,PID:8915爪哇。lang.NullPointerException:尝试调用虚拟方法“double android”。地方地方getLatitude()'位于com上

  • 问题内容: 我正在尝试模拟输入到中的文本。我有一个1字符长的字符串,其中包含要添加的字母,然后运行: 但这似乎并没有改变任何内容。我在这里想念什么? 问题答案: 在我看来就像是虚拟键盘:-) 几乎完全相同的代码对我有用。我建议以下内容: 将目标(在您的情况下为)作为参数传递给构造函数,即: 确保目标有重点。 编辑: 为了验证以上建议,我测试了以下代码段: 这是行不通的,但是,如果对最后一行进行如下

  • 有没有办法更改不可编辑JTextField的样式?如果文本字段设置为editable=false,我们希望文本字段的背景颜色略为灰色。我想其中一种方法就是 在每个组件上,但这似乎容易出错且乏味。 我想要实现的是:正常的JTextfiel应该按照nimbus外观和感觉的定义显示。只读字段(例如editable=false)应具有不同的背景色。禁用字段应按照nimbus LAF的定义显示。 我在Nim

  • 当选中复选框在第二个文本域上设置启用(false)并按回车键时,需要将焦点放在第三个文本域 ,如果没有选中任何复选框,则按回车键可以将焦点放在文本域上作为流。我应该添加任何代码或如何使其工作 我的GUI: