2012-09-06 99 views
0

我正在创建一个计费软件,我想从数据库中显示与我的JTable的项目列中键入的值相匹配的项目名称。为了做到这一点,我添加了一个KeyListener。一切工作正常,除了只有第一个键,触发按键事件。如果我按下Enter键然后再次输入,它会再次触发。我想要为每一个连续输入列的键都触发keyevent,任何人都可以帮助我...... ....?仅当按下第一个键时触发JTable按键事件

我给的代码片段...我要显示在itable从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; 

      }} 
     } 
+1

你能告诉我们你的代码吗? – Sednus

+0

@Sednus我已经添加了片段...是否足够... – Swami

+3

可能重复的[JTextField自动完成](http://stackoverflow.com/questions/8689695/jtextfield-autocomplete) – trashgod

回答

1

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

使用键监听器创建JTextField。把它作为你的表的编辑器(通过getColumn()。setCellEditor()) 然后用“textCellEditor.setClickCountToStart(1);”定义你的单元格编辑器。

+0

不是,错了请检查代码链接在@trashgod的评论中 – mKorbel

1
  • 不使用KeyListenerSwing JComponents,这Listener不指定JTextComponents也不对Compound JComponentsJTableJSpinnerJComboBox

  • 不运行ResultSetDatabas E在每一个事件,也不打开JDBC Connection,因为这两个动作可能需要很长时间,并且GUI以这种形式等待到ResultSet结束

  • ConnectionResultsetStatement必须close(),并进入finally块(try - catch - finally),否则停留在内存,数据库可以得到减少连接的数量太多,你可以得到OutOfMemory或数据库可以拒绝打开,因为一个新的连接你打开超载连接concurent的

    最大数量
  • 代码谈论到AutoCompleted JComboBox or JTextField记录装载数量减少,只有一次时间aplications START_UP,

  • 那么你可以为KA新问题How to .....

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