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)
没问题
我有一个扩展 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)