Java 按TAB键填充JTable

Java 按TAB键填充JTable,java,swing,user-interface,events,jtable,Java,Swing,User Interface,Events,Jtable,我有一个JTable。用户将在特定列中输入ID,然后按TAB键。我需要在该列上添加事件,以从DB获取值,填充该行的其余列,并为下一个条目创建新行 我是Swing新手,很难找到最好的方法,因为我可以看到2010年左右编写的示例。不确定这是否仍然相关 我不知道的是: 将事件处理程序添加到表中特定列的单元格中 填充数据后添加下一行 你可以试试这样的 //Add Key Listener table.addKeyListener(new KeyAdapter() { publ

我有一个
JTable
。用户将在特定列中输入ID,然后按TAB键。我需要在该列上添加事件,以从DB获取值,填充该行的其余列,并为下一个条目创建新行

我是Swing新手,很难找到最好的方法,因为我可以看到2010年左右编写的示例。不确定这是否仍然相关

我不知道的是:

  • 将事件处理程序添加到表中特定列的单元格中
  • 填充数据后添加下一行

  • 你可以试试这样的

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

    您可以为此使用
    TableModelListener
    。当用户更改ID列值时,将调用
    tableChanged()
    。然后从数据库中提取相关数据并在行中设置。并且还添加了一个新行。试试下面的例子

    (出于演示目的,我在本例中使用了一个模拟数据库。它只提供ID“111”和“222”的行。)


    FWIW,Swing在过去10年左右没有太大的变化(JavaFX被提议作为继任者),所以2010年的教程可能会很好。您最好的选择可能是通过扩展
    javax.swing.table.AbstractTableModel来实现您自己的表模型。用户是否按TAB键移出ID列并“提交”ID更改?我有一个表模型。我需要了解的是如何添加正确的事件处理程序和最佳方式。KeyListener或CellEditorListener,我完全搞不懂它们都不是working@PrasadKarunagoda用户在每行的第一列中按TAB键,以便该行的其余部分从数据库自动填充。我需要知道如何为此目的添加事件侦听器。这是有道理的,但我有一个问题,如果在其他非ID列中再次更改表。此侦听器事件将再次激发,数据库调用将再次进行。有些列可以从UI编辑,因此是这种情况。@ShahulBasha,是的。因此,您需要在
    tableChanged()
    中添加逻辑,以便仅在ID列值更改时才进行数据库调用。
    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;
      }
    }