Модель стола доступа качели

Я хотел сделать свое приложение красиво, без 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 таблицами. Так какая-нибудь помощь, как сделать это хорошим способом?

1 ответ

Решение

Было бы хорошо, если JTable поддерживаемые дженерики, это сделает жизнь намного проще, но это не так, у нас нет большого выбора.

Одним из решений было бы воспользоваться преимуществами Action 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 Удалить, так что при нажатии, когда таблица имеет фокус, Action будет срабатывать

Вы можете дополнительно абстрагировать концепцию, определив некоторый тип контроллера, который предоставит доступ к текущей таблице / модели, так что вам нужно будет создать только одну серию Actionс, который взял "контроллер" в качестве ссылки. Контроллер затем предоставит контекст для текущего состояния представления / программы (то есть, какая таблица / модель была активна в данный момент), например...

Другие вопросы по тегам