我正在创建一个结算软件,我想显示数据库中与我的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;
}}
}
答案 0 :(得分:1)
这可能是因为你不再在JTable中,而是在桌子的CellEditor中。
使用键侦听器创建JTextField。将它作为表的编辑器(通过getColumn()。setCellEditor()) 并使用“textCellEditor.setClickCountToStart(1);”
定义单元格编辑器答案 1 :(得分:1)
不要将KeyListener
用于Swing JComponents
,Listener
未指定JTextComponents
,Compound JComponents
未指定为JTable
JSpinner
},JComboBox
或ResultSet
不会针对Databas
e针对每个事件运行JDBC Connection
,也不会针对GUI
开放,因为这两项操作可能会花费很长时间ResultSet
此表单等到Connection
结束
Resultset
,Statement
和close()
必须为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);
}
});
}
}