问题描述
我有一个JTable
。
用户将在特定列中输入ID,然后按TAB键。
我需要在该列上添加事件,以从DB中获取值并填充该行的其余列,并为下一个条目创建新行。
我是Swing的新手,因此很难找到最佳方法,因为我可以看到2010年左右编写的示例。 不知道那是否仍然有意义。
我不知道的是:
- 向表中特定列的单元格添加事件处理程序。
- 填充数据后添加下一行。
1楼
您可以为此使用TableModelListener
。
当用户更改ID列值时,将调用tableChanged()
。
然后,从数据库中获取相关数据并在行中进行设置。
并且也添加了新行。
请尝试以下示例。
(出于演示目的,在此示例中,我使用了模拟数据库。它仅提供ID为“ 111”和“ 222”的行。)
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.DefaultTableModel;
import java.util.Vector;
public class TableDataChange
{
public static void main(String[] args)
{
DefaultTableModel tableModel = new DefaultTableModel(
new Object[][] {{"", "", ""}},
new Object[] {"ID", "Column 2", "Column 3"});
tableModel.addTableModelListener(new TableModelListener()
{
@Override
public void tableChanged(TableModelEvent e)
{
String id = (String) tableModel.getValueAt(e.getFirstRow(), 0);
if (id != null)
{
Vector row = Database.loadRowForId(id);
tableModel.getDataVector().set(e.getFirstRow(), row);
tableModel.addRow(new Vector());
}
}
});
JTable table = new JTable(tableModel);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(table));
f.setBounds(300, 200, 400, 300);
f.setVisible(true);
}
}
// Mock database
class Database
{
static Vector loadRowForId(String id)
{
Vector row = new Vector();
if (id.equals("111"))
{
row.add("111");
row.add("aaa");
row.add("bbb");
}
else if (id.equals("222"))
{
row.add("222");
row.add("ppp");
row.add("qqq");
}
return row;
}
}
2楼
你可以尝试这样
//Add Key Listener
table.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
if (event.getKeyChar() == KeyEvent.VK_TAB) {
int selectedColumn = table.getSelectedColumn();
//Now you can search records related to ID and populate the table
}
}
});