Java 在JTextField中启用快捷方式

Java 在JTextField中启用快捷方式,java,swing,Java,Swing,我有一个JTextField,在框架内,我为一些按钮和菜单项设置了一些快捷方式。一旦我开始在JTextField中输入,当我按下任何快捷键时,它就不起作用了,因为当前的焦点在文本字段上。我怎样才能删除这个 下面是到目前为止我的代码。我用netbeans做过 public class NewJFrame extends javax.swing.JFrame { public NewJFrame() { initComponents(); testTextField.addKeyL

我有一个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                   

}}
公共类NewJFrame扩展了javax.swing.JFrame{
公共NewJFrame(){
初始化组件();
addKeyListener(新的KeyAdapter(){
public void keyTyped(KeyEvent e){
char c=e.getKeyChar();
if(!(字符.isDigit(c)
||(c==KeyEvent.VK_BACK_SPACE)
||(c==KeyEvent.VK|u DELETE)| c==
||(c==KeyEvent.VK_期间)
||(c==KeyEvent.VK_DECIMAL))){
//showMessageDialog(新JFrame(),“仅允许数字”);
e、 消费();
}
}
});
testButton.set助记符(KeyEvent.VK_E);
字符串keyCombination=“alt E”;
击键击键=击键。getKeyStroke(组合键);
testTextField.getInputMap().put(击键、组合键);
testTextField.getActionMap().put(keyCombination,newAbstractAction()){
@凌驾
已执行的公共无效操作(操作事件e){
testButton.doClick();
}
});
}
@抑制警告(“未选中”)
//                           
私有组件(){
java.awt.GridBagConstraints GridBagConstraints;
jPanel1=newjavax.swing.JPanel();
testButton=newjavax.swing.JButton();
testTextField=newjavax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setFocusTraversalPolicyProvider(真);
getContentPane().setLayout(新java.awt.GridLayout());
jPanel1.setFocusCycleRoot(真);
setLayout(新java.awt.gridbagloayout());
setText(“单击”);
testButton.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
执行的测试按钮(evt);
}
});
gridBagConstraints=new java.awt.gridBagConstraints();
gridBagConstraints.gridx=1;
gridBagConstraints.gridy=0;
gridBagConstraints.gridheight=2;
gridBagConstraints.anchor=java.awt.gridBagConstraints.NORTHWEST;
gridbagsconstraints.insets=newjava.awt.insets(118,18,159,96);
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=新java.awt.insets(119,61,0,0);
add(testTextField,gridBagConstraints);
getContentPane().add(jPanel1);
包装();
}//                         
私有void testButtonActionPerformed(java.awt.event.ActionEvent evt){
系统输出打印项次(“按下”);
}                                          
//变量声明-不修改
私有javax.swing.JPanel jPanel1;
私有javax.swing.JButton testButton;
私有javax.swing.JTextField testTextField;
//变量结束声明
}}

谢谢

为了使用您需要使用的快捷方式,以下是如何在
textfield

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);
    }
}

所以,有三件事让我吃惊

一。。。 您不应该在文本组件上使用
KeyListener
s,只是不能保证在
文档
发生关键事件之前会通知您,或者
文档
没有处于更改状态。此外,这也不能处理用户将文本粘贴到字段中的情况

相反,您应该使用
DocumentFilter
将内容过滤到字段中

两个。。。 不需要向文本字段添加键绑定。这主意不错,但如果你有10个字段和10条捷径,那就需要做很多额外的工作

事实上,更好的解决方案是将键绑定应用于按钮本身

三。。。 助记符与组件的文本结合使用,以向用户显示快捷方式,这意味着当按钮的文本为“单击”时,您将永远无法激活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                   

}
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.event.KeyEvent;
导入javax.swing.JFrame;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类NewJFrame扩展了javax.swing.JFrame{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
NewJFrame=newnewjframe();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共NewJFrame(){
初始化组件();
//addKeyListener(新的KeyAdapter(){
//public void keyTyped(KeyEvent e){
//char c=e.getKeyChar();
//if(!(字符.isDigit(c)
//| |(c==KeyEvent.VK_BACK_SPAC
    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);
        }
    }

}