Проблема фокуса пользовательского рендеринга ячеек JTable

У меня есть такая таблица. Во втором столбце используется модуль визуализации JTextField, а в третьем столбце — модуль визуализации и редактор на основе JPasswordField.

введите здесь описание изображения

Выглядит неплохо. Но проблема в том, что мы должны ввести значения и нажать «ENTER». На этом изображении я ввел свой пароль, но не нажал Enter. Поэтому, если я нажму кнопку «Сохранить и закрыть», появится сообщение об ошибке, что поле пароля пусто.

Раньше я использовал только JTextFields и JPasswordFields под JTabbedPane, и это работало хорошо. Когда мне нужно было добавлять все больше и больше вещей, я изменил его на вот такую ​​таблицу.

На данный момент я поставил метку, чтобы люди знали, что они должны нажать ENTER. Это нехорошо. Еще одна большая проблема. По крайней мере, в Nimbus Look and feel мы получаем представление о том, что эта область все еще находится в центре внимания. В системе Windows нет большой видимой разницы, сфокусировано поле или нет.

введите здесь описание изображения

Мне нужно поле имени пользователя или поле пароля, чтобы установить его значение, когда я нажимаю кнопку «Сохранить и закрыть». Пожалуйста помогите.


person Vigneshwaran    schedule 01.09.2011    source источник


Ответы (2)


Итак, ваша проблема в том, что вы все еще редактируете ячейку. Поэтому вам нужно остановить редактирование, и тогда ячейка будет изменена.

На вашей кнопке вы можете получить ячейку, которая редактируется с помощью
TableCellEditor cellEditor = table.getCellEditor();
, затем вы можете остановить редактирование с помощью
if(cellEditor!=null){
cellEditor.stopCellEditing();
}

, а затем вы можете сохранить значение

person Neifen    schedule 01.09.2011
comment
Первый столбец не редактируется. Так что перед stopEditing() нужно проверить значение null; Большое спасибо за простое решение. :) - person Vigneshwaran; 01.09.2011
comment
возможно, но имеет недостатки: а) вы должны делать это в каждом месте, которое зависит от того, что фиксация произошла б) эти места должны знать JTable, что приводит к нежелательной связи - person kleopatra; 02.09.2011

Скажите таблице, чтобы она автоматически фиксировалась при потере фокуса:

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
person kleopatra    schedule 01.09.2011