在JTextField中启用快捷方式



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

最新更新