2012-09-06 96 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); 
      } 
     }); 
    } 
}