我有一个JTextField,在框架内,我为一些按钮和菜单项设置了一些快捷方式。一旦我开始在JTextField中键入,当我按下任何快捷键时,它都不起作用,因为当前的焦点是文本字段。我该如何删除它。
以下是到目前为止我的代码。我在netbeans上做过。
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
testTextField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (!(Character.isDigit(c)
|| (c == KeyEvent.VK_BACK_SPACE)
|| (c == KeyEvent.VK_DELETE) || c == '.'
|| (c == KeyEvent.VK_PERIOD)
|| (c == KeyEvent.VK_DECIMAL))) {
//JOptionPane.showMessageDialog(new JFrame(), "Only Numeric allowed");
e.consume();
}
}
});
testButton.setMnemonic(KeyEvent.VK_E);
String keyCombination = "alt E";
KeyStroke keyStroke = KeyStroke.getKeyStroke(keyCombination);
testTextField.getInputMap().put(keyStroke, keyCombination);
testTextField.getActionMap().put(keyCombination, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
testButton.doClick();
}
});
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel1 = new javax.swing.JPanel();
testButton = new javax.swing.JButton();
testTextField = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setFocusTraversalPolicyProvider(true);
getContentPane().setLayout(new java.awt.GridLayout());
jPanel1.setFocusCycleRoot(true);
jPanel1.setLayout(new java.awt.GridBagLayout());
testButton.setText("Click");
testButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
testButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(118, 18, 159, 96);
jPanel1.add(testButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.ipadx = 146;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(119, 61, 0, 0);
jPanel1.add(testTextField, gridBagConstraints);
getContentPane().add(jPanel1);
pack();
}// </editor-fold>
private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println("pressed");
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JButton testButton;
private javax.swing.JTextField testTextField;
// End of variables declaration
}}
感谢
所以,我突然想到了三件事…
一
您不应该在文本组件上使用KeyListener
,只是不能保证您会在Document
之前收到关键事件的通知,或者Document
没有处于更改状态。此外,这不会处理用户将文本粘贴到字段中的情况。。。
相反,您应该使用DocumentFilter
将内容过滤到字段中。。。
- 实现文档筛选器
- DocumentFilter示例
两个
应该不需要向文本字段添加键绑定。这不是一个坏主意,但如果你有10个领域和10个捷径,那就需要做很多额外的工作。。。
事实上,更好的解决方案是将密钥绑定应用于按钮本身。。。
三
助记符与组件的文本结合使用,向用户显示快捷方式,这意味着当按钮的文本为Click
时,您将永远无法激活Alt>+E
相反,您将文本更改为包含e
/E
的内容,或将助记符更改为文本中的字符,如C,它将起作用。。。
例如。。。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class NewJFrame extends javax.swing.JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
NewJFrame frame = new NewJFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public NewJFrame() {
initComponents();
// testTextField.addKeyListener(new KeyAdapter() {
// public void keyTyped(KeyEvent e) {
// char c = e.getKeyChar();
// if (!(Character.isDigit(c)
// || (c == KeyEvent.VK_BACK_SPACE)
// || (c == KeyEvent.VK_DELETE) || c == '.'
// || (c == KeyEvent.VK_PERIOD)
// || (c == KeyEvent.VK_DECIMAL))) {
// //JOptionPane.showMessageDialog(new JFrame(), "Only Numeric allowed");
// e.consume();
// }
// }
// });
testButton.setMnemonic(KeyEvent.VK_C);
// String keyCombination = "alt E";
//
// KeyStroke keyStroke = KeyStroke.getKeyStroke(keyCombination);
// testTextField.getInputMap().put(keyStroke, keyCombination);
// testTextField.getActionMap().put(keyCombination, new AbstractAction() {
// @Override
// public void actionPerformed(ActionEvent e) {
// testButton.doClick();
// }
// });
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel1 = new javax.swing.JPanel();
testButton = new javax.swing.JButton();
testTextField = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setFocusTraversalPolicyProvider(true);
getContentPane().setLayout(new java.awt.GridLayout());
jPanel1.setFocusCycleRoot(true);
jPanel1.setLayout(new java.awt.GridBagLayout());
testButton.setText("Click");
testButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
testButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(118, 18, 159, 96);
jPanel1.add(testButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.ipadx = 146;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(119, 61, 0, 0);
jPanel1.add(testTextField, gridBagConstraints);
getContentPane().add(jPanel1);
pack();
}// </editor-fold>
private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println("pressed");
}
// Variables declaraÏtion - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JButton testButton;
private javax.swing.JTextField testTextField;
// End of variables declaration
}
为了使用快捷方式,您需要使用KeyBinding,以下是如何在textfield
上使用alt+E
组合
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
public class KLisDemo {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel comp = new JPanel();
JTextField textField = new JTextField(20);
String keyCombination = "alt E";
KeyStroke keyStroke = KeyStroke.getKeyStroke(keyCombination);
textField.getInputMap().put(keyStroke, keyCombination);
textField.getActionMap().put(keyCombination, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
textField.setText("ALT+E was pressed");
}});
comp.add(textField);
frame.add(comp);
frame.setSize(new Dimension(500,500));
frame.setVisible(true);
}
}
我解决了它,下面是代码。如果有更好的答案,请更新。
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
testButton.setMnemonic(KeyEvent.VK_E);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel1 = new javax.swing.JPanel();
testButton = new javax.swing.JButton();
testTextField = new NumberField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setFocusTraversalPolicyProvider(true);
getContentPane().setLayout(new java.awt.GridLayout());
jPanel1.setFocusCycleRoot(true);
jPanel1.setLayout(new java.awt.GridBagLayout());
testButton.setText("Click");
testButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
testButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(118, 18, 159, 96);
jPanel1.add(testButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.ipadx = 146;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(119, 61, 0, 0);
jPanel1.add(testTextField, gridBagConstraints);
getContentPane().add(jPanel1);
pack();
}// </editor-fold>
private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println("pressed");
}
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JButton testButton;
private NumberField testTextField;
// End of variables declaration
}
public class NumberField extends JTextField {
@Override
protected Document createDefaultModel() {
return new Numberdocument();
}
}
class Numberdocument extends PlainDocument {
String numbers = "1234567890-";
@Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (!numbers.contains(str)) {
JOptionPane.showMessageDialog(new JFrame(), "Only Numbers Allowed");
} else {
super.insertString(offs, str, a);
}
}
}