Мое окончательное решение (частично благодаря этому гуру кода ) было создание анонимного внутреннего класса, который расширяет 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);
}
};
Это решение, кажется, работает до сих пор, но я не тестировал его всесторонне.В одном из темных углов этого кода могут быть ошибки или скрытые ошибки ...
Надеюсь, это поможет кому-то еще!