Перехватить события изменения выбора jTable - PullRequest
4 голосов
/ 17 июня 2010

Я нашел эту ветку форума , в которой предлагается переопределить ListSelectionModel для предотвращения выбора строк.

Я бы хотел предотвратить изменения выбора, когда есть несохраненные изменения (внешние по отношению к таблице) для текущего выбранного элемента, пока пользователь не подтвердит сброс. Что-то вроде:

public class confirmSelectionChange extends DefaultListSelectionModel {
    public void setSelectionInterval(int index0, int index1) {
        if (unsavedChanges()) {
            super.setSelectionInterval(int index0, int index1);
        }
    }

    private boolean unsavedChanges() {
        if (noUnsavedChangesExist) {
            return true;
        }

        // Present modal dialog: save, discard cancel
        if (dialogAnswer == SAVE) {
            // save changes
            return true;
        } else if (dialogAnswer == DISCARD) {
            return true;
        } else {
            return false;
        }
    }
}

Можно ли вставить блокирующий код в середине изменений ListSelectionModel? Есть ли лучший способ перехватить события изменения выбора?

Я их уже слушаю, но к тому времени изменения уже произошли.

1 Ответ

3 голосов
/ 17 июня 2010

Мое окончательное решение (частично благодаря этому гуру кода ) было создание анонимного внутреннего класса, который расширяет JTable и переопределяет changeSelection().Пробовал отдельный класс, так как я читал, что некоторые люди не думают, что анонимные внутренние классы являются хорошим ОО-дизайном, но мне нужно было знать о состоянии редактирования, плюс мне пришлось вызывать методы сохранения / отбрасывания.Кому нужна инкапсуляция, если это ваш собственный код?; -)

jTableMemberList = new JTable() {
    public void changeSelection(int rowIndex, int columnIndex, boolean toggle,
                                boolean extend) {
        // Member is being edited and they've clicked on a DIFFERENT row (this
        // method gets called even when the selection isn't actually changing)
        if (editModeIsActive && getSelectedRow() != rowIndex) {
            // User was editing, now they're trying to move away without saving
            Object[] options = {"Save", "Discard", "Cancel"};
            int n = JOptionPane.showOptionDialog(this,
                                            "There are unsaved changes for the "
                                            + "currently selected member.\n\n"
                                            + "Would you like to save them?",
                                            "Save changes?",
                                            JOptionPane.YES_NO_CANCEL_OPTION,
                                            JOptionPane.WARNING_MESSAGE,
                                            null,
                                            options,
                                            options[0]);

            if (n == JOptionPane.YES_OPTION) {
                saveChanges();
            } else if (n == JOptionPane.NO_OPTION) {
                discardChanges();
            } else {
                // Exit without passing call on to super
                return;
            }
        }

        // make the selection change
        super.changeSelection(rowIndex, columnIndex, toggle, extend);
    }
};

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

Надеюсь, это поможет кому-то еще!

...