0

我想很好地制作我的应用程序,没有 100 个内部类和东西。我有一个包含一些数据列表的类。我有菜单,其中包含使用 AbstractActions 的项目,例如。我想在那里采取行动从表中删除选定的项目。为此,我需要表和表模型的参考。我想将此操作添加到菜单项,我需要传递对稍后创建的表和表模型的引用,因为我这样做:

    MainMenuBar menuBar = new MainMenuBar(db);
    MainTabbedPane tabbedPane = new MainTabbedPane(db);

    this.setLayout(new BorderLayout());
    add(menuBar, BorderLayout.PAGE_START);
    add(tabbedPane, BorderLayout.CENTER);

其中 tabbedPane 有 2 个选项卡和 2 个表。那么有什么帮助如何以一种好的方式做到这一点吗?

4

1 回答 1

2

如果JTable支持泛型就好了,它会让生活更轻松,但事实并非如此,所以我们没有太多选择。

一种解决方案是利用Actions 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提供您需要的功能的特定实现。

这种方法将允许您将这些操作应用于JMenuItemJButton键绑定,这意味着您可以例如将 分配ActionDelete,以便在表格具有焦点时按下时,Action将触发

您可以通过定义某种控制器来进一步抽象概念,该控制器提供对当前表/模型的访问,因此您只需要创建一系列Action以“控制器”作为参考的 s。然后,控制器将为视图/程序的当前状态提供上下文(即,哪个表/模型当前处于活动状态),例如......

于 2014-07-27T22:29:11.780 回答