Java Swing 扩展了 JTable anonymouse class

Java Swing extends JTable anonymouse class

我有一个扩展 JTable 的 class。在那个 class 中,我创建了一个已填充的客户 table。当我单击特定行时,我想取出该选定行的 ID 字段。

现在我的问题是我找到的所有信息都提到使用

table.getColumnModel().... table.convertRowIndex ....

但是在我的匿名事件 ListSelectionListener 中我无法让它工作。它不想使用这个。反映到 JTable,我不能使用 table。因为无法识别。

@Component
public class CustomersTable extends JTable {

private final CustomerService customerService;

public CustomersTable(CustomerService customerService) {
    this.customerService = customerService;
    String[] columnNames = new String[]{"Id", "Voornaam", "Achternaam", "Email", "Telefoon", "Straat", "Nummer",
            "Postcode", "Stad", "Commentaar"};
    DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
     this.setModel(tableModel);


    List<CustomerEntity> allCustomer = this.customerService.getAllCustomer();
    for (CustomerEntity entity : allCustomer) {
         tableModel.addRow(entity.getForJTable());
    }

    // De selectie van de rij
    ListSelectionModel model = this.getSelectionModel();
    model.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    model.addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            
            if(!model.isSelectionEmpty()) {
                // get selected row
                // long id = this.getColumnModel().getColumnIndex("Id");

                int selectedRow = model.getMinSelectionIndex();
                // openCustomerCard(selectedRow);
            }
        }
    });
}

}
// long id = this.getColumnModel().getColumnIndex("Id");

“this”指的是您的 ListSelectionListener 的实例。

要访问 JTable 的实例,您可以使用:

JTable table = CustomersTable.this;

然而这并不是最好的设计。不要扩展 JTable。

您只应在向 class 添加功能时扩展 class。创建 TableModel 或添加侦听器并不是添加功能。

阅读 How to Use Tables 上的 Swing 教程部分。 TableFilterDemo 展示了如何使用 ListSelectionListener。

Now my issue is that all info I find speaks of using a table.getColumnModel()....

不需要使用列模型。您从 TableModel 中获取数据:

int row = table.getSelectedRow();
long id = table.getModel().getValueAt(row, 0);

table.convertRowIndex ....

您只需要在排序或过滤 table 时使用该方法,但是为了安全起见,使用该方法是一种很好的做法:

int row = table.convertRowIndexToModel( table.getSelectedRow() );
long id = table.getModel().getValueAt(row, 0);

还要考虑到 JTable 有自己的 getValueAt(int row, int column) 方法;使用这种方法你不需要使用 convertRowIndexToModel(int row);此外,由于 JTable 具有移动列的能力,您还应该转换列索引,但是,再一次,使用 JTable.getValueAt(int row, int column)

没问题