Как получить JTable selectedRow и selectedColumn во время события FocusLost

Всякий раз, когда внутри JTable есть lostFocus, мне нужно захватить строку и столбец существующей ячейки.

Однако приведенное ниже условие всегда ложно, потому что источником всегда является либо JTextField, либо JComboBox.

public void focusLost(FocusEvent e) {
int row, col;

Object source = e.getSource();
if(((Component) source).getParent() instanceof JTable_Ext){  //<-- always false
    table = (JTable_Ext) ((Component) source).getParent();
    row = table.getSelectedRow();
    col = table.getSelectedColumn();
}

Чтобы смягчить вышеуказанное, я запомнил строку и столбец во время FocusGained (как переменную уровня класса). Проблема в том, что если пользователь очень быстро щелкает по всему месту в JTable, информация о строках и столбцах каким-то образом не синхронизируется.

Есть ли способ получить Row и Col во время FocusLost? если нет, есть ли лучший способ сделать это?


person Reusable    schedule 09.06.2011    source источник


Ответы (4)


Ну вот и oppositeComponent. Странно то, что если этот слушатель прикреплен к таблице, в документации указано, что таблица должна быть «исходным» компонентом (потому что это событие FocusLost, а компонент, потерявший фокус, является самой таблицей).

http://download.oracle.com/javase/1.4.2/docs/api/java/awt/event/FocusEvent.html#getOppositeComponent%28%29

person SJuan76    schedule 09.06.2011
comment
противоположный компонент - это javax.swing.JViewport. не JTable - person Reusable; 09.06.2011

Не могли бы вы просто вести учет строки и столбца, используя

table.getSelectionModel().addListSelectionListener(...);
table.getColumnModel().getSelectionModel().addListSelectionListener(...);

Значит, обновлять его каждый раз, когда пользователь нажимает, а не только на событиях фокуса?

person Nick Fortescue    schedule 09.06.2011
comment
Какой слушатель мне следует использовать? в настоящее время я использую FocusListener. - person Reusable; 09.06.2011
comment
Я имею в виду, как лучше всего передать информацию о строках и столбцах из ListSelectionListener в FocusListener? - person Reusable; 09.06.2011

Если вы просто хотите сохранить данные, которые были введены в ячейку (не нажимая return), вам не нужно ничего делать. Обновленная информация содержится в TableModel JTable.

В противном случае вы можете взглянуть на .tableChanged() и связанный с ним TableModelEvent, который дает вам последнюю измененную строку / столбец. Вы можете сохранить переменную, которая всегда обновляется до последней строки / столбца события. Я предполагаю, что если вы измените номер ячейки, не нажав return, это все равно будет зарегистрировано как событие.

person toto2    schedule 09.06.2011

Однако приведенное ниже условие всегда ложно, потому что источником всегда является либо JTextField, либо JComboBox.

Это означает, что событие focusLost генерируется, когда вы начинаете редактировать ячейку. Итак, вопрос в том, зачем вы это делаете? Я думаю, вам нужно указать свои фактические требования, потому что попытка решения не кажется подходящей.

person camickr    schedule 09.06.2011
comment
Функциональное требование таково: - person Reusable; 10.06.2011