如果JTable
支持泛型就好了,它会让生活更轻松,但事实并非如此,所以我们没有太多选择。
一种解决方案是利用Action
s API,这将允许您定义一系列自包含的“操作”,这些“操作”可以同样应用于菜单、按钮和键绑定。
例如...
public abstract class AbstractTableAction<M extends TableModel> extends AbstractAction {
private JTable table;
private M model;
public AbstractTableAction(JTable table, M model) {
this.table = table;
this.model = model;
}
public JTable getTable() {
return table;
}
public M getModel() {
return model;
}
}
然后您可以定义更集中的操作...
public class DeleteRowAction extends AbstractTableAction<MutableTableModel> {
public DeleteRowAction (JTable table, MutableTableModel model) {
super(table, model);
putValue(NAME, "Delete selected row(s)");
}
public void actionPerformed(ActionEvent evt) {
JTable table = getTable();
int rows[] = table.getSelectedRows();
for (int index = 0; index < rows.length; index++) {
rows[index] = table.convertRowIndexToModel(rows[index]);
}
getModel().removeRows(rows);
}
}
现在,显然,MutableTableModel
这只是示例,但它是TableModel
提供您需要的功能的特定实现。
这种方法将允许您将这些操作应用于JMenuItem
和JButton
键绑定,这意味着您可以例如将 分配Action
给Delete,以便在表格具有焦点时按下时,Action
将触发
您可以通过定义某种控制器来进一步抽象概念,该控制器提供对当前表/模型的访问,因此您只需要创建一系列Action
以“控制器”作为参考的 s。然后,控制器将为视图/程序的当前状态提供上下文(即,哪个表/模型当前处于活动状态),例如......