JTable按键事件仅在按下的第一个键时触发

时间:2012-09-06 15:12:51

标签: java swing jdbc autocomplete

我正在创建一个结算软件,我想显示数据库中与我的JTable的items列中输入的值匹配的项目名称。为此,我添加了一个KeyListener。一切正常,但只有第一个键,才会触发按键事件。如果我按回车键然后再次键入,它会再次被触发。我想要为连续输入列的每个键触发keyevent,任何人都可以帮助我....?

我将给出代码片段...我希望DB中的项目显示在可用的...

     public void keyPressed(KeyEvent e) {
        rows=table.getSelectedRow();
        cols=table.getSelectedColumn();
        if(cols==2){
           String code=(String)table.getValueAt(rows, cols);

           Statement stmt = null;
           ResultSet rs = null;

           for (int i =model1.getRowCount();i>0; i--) {
              model1.removeRow(i-1);
            }
            table.changeSelection(rows,cols, false, false);

           itable.setVisible(true);
           int i=0;
           String SQL = "SELECT * FROM items where name like\'"+code+"%\' or
                           code=\'"+code+"\' order by name";

           try{
               stmt =  (Statement) dbcon.con.createStatement();
               rs = stmt.executeQuery(SQL);
               while (rs.next()) {
                    model1.insertRow((i),new Object[]{""});
                    itable.setValueAt((Object)rs.getString("name"), i, 0);
                     i++;
                }

            }
            catch(Exception e1){
                  table.editCellAt(rows,cols,null);
                  return;

            }}
        }

3 个答案:

答案 0 :(得分:1)

这可能是因为你不再在JTable中,而是在桌子的CellEditor中。

使用键侦听器创建JTextField。将它作为表的编辑器(通过getColumn()。setCellEditor()) 并使用“textCellEditor.setClickCountToStart(1);”

定义单元格编辑器

答案 1 :(得分:1)

  • 不要将KeyListener用于Swing JComponentsListener未指定JTextComponentsCompound JComponents未指定为JTable JSpinner },JComboBoxResultSet

  • 不会针对Databas e针对每个事件运行JDBC Connection,也不会针对GUI开放,因为这两项操作可能会花费很长时间ResultSet此表单等到Connection结束

  • ResultsetStatementclose()必须为finally,并且try - catch - finally阻止(OutOfMemory)否则会留在内存,数据库也可以减少连接数量,你可以获得AutoCompleted JComboBox or JTextField或者数据库可以拒绝打开新连接,因为你重载了最大数量的打开的连接连接

  • 您的代码正在讨论将减少的记录数量加载到{{1}},只在应用程序上加载一次Start_Up,

  • 然后您可以提出一个新问题How to .....

答案 2 :(得分:1)

问题是,只要您选择了一个表键,表就会开始编辑所选项(并且所有以下键事件都将定向到'TableCellEditor')。

假设您不希望以这种方式编辑任何数据,一个简单的解决方案就是覆盖'DefaultTableModel',这样就不会有任何数据可编辑。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestProject extends JPanel{

    public TestProject(){
        super();

        //Use default table model - only make it so no cells are editable
        final DefaultTableModel model = new DefaultTableModel(0, 5){
            @Override
            public boolean isCellEditable(int row, int column){
                return false; // makes no table cells editable
            }
        };

        //Create table off of Table Row
        final JTable table = new JTable(model);
        for(int i = 0; i < 20; i++){
            model.addRow(new String[]{i+".1", i+".2",i+".3",i+".4",i+".5",});
        }

        add(table, BorderLayout.CENTER);

        //Add Key Listener
        table.addKeyListener(new KeyAdapter() {         
             public void keyPressed(KeyEvent e) {
                 System.out.println("pressed");
                 char key = e.getKeyChar();
                 int selectedColumn = table.getSelectedColumn();

                 //Update info in table
                 for(int i = 0; i < model.getRowCount(); i++){
                     String value = (String)model.getValueAt(i, selectedColumn);
                     model.setValueAt(value + key, i, selectedColumn);
                 }
             }
        });
    }

    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setContentPane(new TestProject());    
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}