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。而是设置文本组件的属性
添加回答
举报