【问题标题】:Apply keyEvent to a method将 keyEvent 应用于方法
【发布时间】:2013-12-10 07:52:42
【问题描述】:

我创建了这个方法:

public void comboS() {

    ResultSet rset = null;
    String sch = ((JTextField) ComboItemName.getEditor().getEditorComponent()).getText();
    try {
        rset = new JDBC.DB().getData("SELECT * FROM item_reg WHERE id LIKE '" + sch + "%';");
    } catch (Exception e) {
        System.out.println(e);
    }
    ComboItemName.removeAllItems();
    try {
        while (rset.next()) {
            String item = rset.getString("id");
            ComboItemName.addItem(item);
        }
    } catch (SQLException ex) {
        Logger.getLogger(jfilechooser.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.out.println(sch);
    ComboItemName.setSelectedItem(null);
    ComboItemName.setPopupVisible(true);
    ((JTextField) ComboItemName.getEditor().getEditorComponent()).setText(sch);

}

我在 JComboBox(ComboItemName) 的 actionPerformed 中调用此方法。当我输入 HDD 并按 Enter 键时,它会显示数据库中硬盘的所有 ID。但我希望在输入 HDD 时显示它。我认为为此,应该将 keyEvent 应用于这样的方法。

public void comboS(java.awt.event.KeyEvent evt)

但我不知道如何调用此方法以及在组合框中的哪个位置。请为此提供一些帮助。谢谢。 像这样

【问题讨论】:

    标签: java swing netbeans jcombobox keyevent


    【解决方案1】:

    为此目的在您的编辑器组件上使用DocumentListener,这是一个示例:

    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.JTextComponent;
    
    public class Example extends JFrame {
    
    
        public Example() {
            JComboBox comboBox = new JComboBox(new String[]{"1","2"});
            comboBox.setEditable(true);
            ((JTextComponent)comboBox.getEditor().getEditorComponent()).getDocument().addDocumentListener(new DocumentListener() {
    
                @Override
                public void removeUpdate(DocumentEvent arg0) {
                    validateHDD(arg0);
                }
    
                @Override
                public void insertUpdate(DocumentEvent arg0) {
                    validateHDD(arg0);
                }
    
                @Override
                public void changedUpdate(DocumentEvent arg0) {
                    validateHDD(arg0);
                }
    
                private void validateHDD(DocumentEvent arg0) {
                    try {
                        String text = arg0.getDocument().getText(0, arg0.getDocument().getLength());
                        if(text.equals("HDD")){
                            System.out.println("HDD entered");
                            //call your method here
                        }
                    } catch (BadLocationException e) {
                        e.printStackTrace();
                    }
                }
    
            });
            add(comboBox);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Example frame = new Example();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    validateHDD验证你是否在JComboBox的编辑器中输入了HDD,如果是则执行一些逻辑。

    【讨论】:

    • 不完全是 HDD 来自数据库的任何 id HDD 用于硬盘 MON 用于监视器
    【解决方案2】:

    要在 ComboBox 上附加 KeyListener,首先您的 Combo 必须是可编辑的。

        jComboBox1.setEditable(true);
    

    然后像这样附加 KeyListener:

        jComboBox1.getEditor().getEditorComponent().addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println(e.getKeyChar() + " KEY_TYPED DETECTED. \n");
            }
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println(e.getKeyChar() + " KEY_PRESS DETECTED. \n");
            }
            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println(e.getKeyChar() + " KEY_RELEASE DETECTED. \n");
            }
        });
    

    就这么简单:)

    更新

    正如@alex2410 所发现的,最好用DocumentListener 来实现它。方法如下:

        final JTextComponent tc = (JTextComponent) jComboBox1.getEditor().getEditorComponent();
        tc.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                System.out.println("Combo Value is: " + tc.getText() + " . \n");
            }
    
            @Override
            public void removeUpdate(DocumentEvent e) {
                System.out.println("Combo Value is: " + tc.getText() + " . \n");
            }
    
            @Override
            public void changedUpdate(DocumentEvent e) {
                System.out.println("Combo Value is: " + tc.getText() + " . \n");
            }
        });
    

    请注意Java code Conventions

    【讨论】:

    • 好的,那么在哪里调用..jcombobox actionPerformed 或任何组合框事件
    • 初始化 Combo 后将附加 KeyListener
    • -1...KeyListener 这是低级实现,而不是您需要在编辑器组件上使用DocumentListener
    • 从您的代码中可以看出,您应该在调用 ComboBox ComboItemName = new ComboBox(); 之后添加 Key 侦听器。如果您在 NetBeans 中执行此操作,请在构造函数中添加此代码,方法是在 initComponents(); 方法之后将 jComboBox1 替换为 ComboItemName
    • 但是你在构造函数中做了所有这些事情..但是我的应用程序在我的应用程序中通过拖放创建组合框..在 JSP 中解决方案是什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多