0

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

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

     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;

            }}
        }
4

3 回答 3

1

这可能是因为您不再在 JTable 中,而是在表格的 CellEditor 中。

创建一个带有键侦听器的 JTextField。将其作为表格的编辑器(通过 getColumn().setCellEditor())并使用“textCellEditor.setClickCountToStart(1);”定义您的单元格编辑器

于 2012-09-06T16:27:24.067 回答
1
  • 不要使用KeyListenerfor Swing JComponents,这Listener不是指定 forJTextComponents也不是 for Compound JComponentsas JTableJSpinner或者JComboBox

  • 不要在每个事件上都与 eResultSet对抗Databas,也不要打开JDBC Connection,因为这两个动作可能需要很长时间并且GUI以这种形式等待直到ResultSet结束

  • Connection, Resultsetand Statementmust be close(), and into finallyblock ( try - catch - finally) 否则会留在内存中,数据库也可以减少连接数,您可以获取OutOfMemory或数据库可以拒绝打开新连接,因为您超载了打开的最大并发连接数

  • 您的代码谈论将减少的记录数加载到AutoCompleted JComboBox or JTextField应用程序 Start_Up 上,仅一次,

  • 那么你可以问一个新问题如何......

于 2012-09-06T18:44:31.280 回答
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);
            }
        });
    }
}
于 2012-09-06T19:44:30.703 回答