2015-07-27 6 views
1

На данный момент я заинтересован в том, что действие «отменить» JTable ... в частности, я пытаюсь выяснить, почему, с помощью InputVerifier, установленного для компонента CellEditor JTable (JTextField), значение IV должно составлять значение YieldFocus () метод вызывается не один раз, а дважды (!), когда я нажимаю Escape.Есть ли где-нибудь, где мы можем найти фактический код Действия в предоставляемых Framework ActionMaps?

Я проверил, что это запись ActionMap JTable для VK_CANCEL ('cancel'), которая запускается здесь.

Кроме того, я обнаружил, что метод редактирования JTableCanceled НЕ вызывается, когда я нажимаю Escape, как это ... и это в свою очередь делает несколько сложным в настоящее время, чтобы позволить IV знать, что происходит действие отмены (и что проверка не должна поэтому назовем).

Конечно, достаточно легко создать собственное действие «Отмена», которое вызывает действие «Отмена», полученное из ActionMap JTable, но также устанавливает флаг «игнорирование текста JTF ... мы отменяем», , Но я просто хотел бы увидеть, что действие аннулирования фактически состоит из ... то есть кода.

позже
поглядев на исходный код для одного или двух классов, в частности JComponent и AbstractCellEditor, оказывается, что shouldYieldFocus в IV, срабатывает, возможно, не то, что удивительно, когда просьба о проведении фокус прочь.

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

+0

Если вы используете JDK, исходный код уже поставляется. Просто установите точку останова в вашем методе 'shouldYieldFocus' и найдите цепочку вызовов ... – Holger

+0

Спасибо ... на самом деле я фанатик Jython, поэтому это не вариант с моим кодом приложения. Хотя, конечно, я могу шуметь, если понадобится, Java-эксперимент! –

+0

На самом деле, подумайте ... Я исследовал стек, чтобы попытаться дать именно это: откуда этот звонок? Когда вы нажимаете Enter, вызывается CellEditor.stopCellEditing и IV.shouldYieldFocus из этого ... но с двумя вызовами, вызванными действием «cancel» после нажатия клавиши Escape, IV.shouldYieldFocus является *** первым *** вызовом ... означает, что на самом деле это команда в Runnable.run(), которая запускается ... что-то. –

ответ

2

Да. Как обсуждалось, here и проиллюстрировано here, подклассы TextAction установлены как key bindings делегатом пользовательского интерфейса текстового компонента, как правило, подклассом BasicTextUI. Каждый Action обычно является экземпляром класса, вложенного в соответствующий набор редакторов. Например, DefaultEditorKit включает в себя несколько действий public, а также большее количество действий, используемых внутри.

Обработчик для Action имени "cancel" можно найти, среди прочего, в делегат JTable UI, как правило, подкласс BasicTableUI.

Как указано в Validating Input, убедитесь, что ваша реализация verify() не имеет побочных эффектов. Полный пример рассмотрен here. Примеры с использованием InputVerifier в TableCellEditor показаны here и here.

действия и ключи связаны WHEN_FOCUSED к JTextField по com.apple.laf.AquaLookAndFeel:

beep: 
caret-backward: LEFT, KP_LEFT, ctrl B 
caret-begin: ctrl P, meta UP, meta KP_UP, HOME 
caret-begin-line: KP_UP, ctrl A, UP, meta KP_LEFT, meta LEFT 
caret-begin-paragraph: 
caret-begin-word: 
caret-down: 
caret-end: ctrl N, END, meta KP_DOWN, ctrl V, meta DOWN 
caret-end-line: DOWN, meta KP_RIGHT, ctrl E, meta RIGHT, KP_DOWN 
caret-end-paragraph: 
caret-end-word: 
caret-forward: RIGHT, ctrl F, KP_RIGHT 
caret-next-word: alt KP_RIGHT, alt RIGHT 
caret-previous-word: alt KP_LEFT, alt LEFT 
caret-up: 
copy: 
copy-to-clipboard: meta C, COPY 
cut: 
cut-to-clipboard: CUT, meta X 
default-typed: 
delete-next: DELETE, ctrl D 
delete-next-word: alt DELETE 
delete-previous: BACK_SPACE, ctrl H 
delete-previous-word: alt BACK_SPACE, ctrl W 
dump-model: 
insert-break: 
insert-content: 
insert-tab: 
notify-field-accept: ENTER 
page-down: 
page-up: 
paste: 
paste-from-clipboard: meta V, PASTE 
requestFocus: 
select-all: meta A 
select-line: 
select-paragraph: 
select-word: 
selection-backward: shift LEFT, shift KP_LEFT 
selection-begin: shift meta KP_UP, shift meta UP, shift HOME 
selection-begin-line: shift UP, shift meta KP_LEFT, shift KP_UP, shift meta LEFT 
selection-begin-paragraph: 
selection-begin-word: 
selection-down: 
selection-end: shift meta DOWN, shift meta KP_DOWN, shift END 
selection-end-line: shift meta KP_RIGHT, shift DOWN, shift KP_DOWN, shift meta RIGHT 
selection-end-paragraph: 
selection-end-word: 
selection-forward: shift KP_RIGHT, shift RIGHT 
selection-next-word: shift alt KP_RIGHT, shift alt RIGHT 
selection-page-down: shift PAGE_DOWN 
selection-page-left: shift meta PAGE_UP 
selection-page-right: shift meta PAGE_DOWN 
selection-page-up: shift PAGE_UP 
selection-previous-word: shift alt LEFT, shift alt KP_LEFT 
selection-up: 
set-read-only: 
set-writable: 
toggle-componentOrientation: shift ctrl O 
unselect: meta BACK_SLASH 
+0

спасибо ... на самом деле это не ключевые привязки JTextComponent, которые я (в настоящее время) интересуюсь исследованием. Обратите внимание, что «cancel» отсутствует в вашем списке ... это на самом деле принадлежит ActionMap JTable (или родитель или его дед или бабушка). При редактировании, как я уверен, вы знаете, компонент редактора, в моем случае JTextField, становится дочерним компонентом JTable ... поскольку он не может перехватить нажатие клавиши VK_CANCEL, это передается JTable. Я все еще не понимаю, где в исходном коде я могу найти код для действия «отменить» JTable ... –

+0

О, _that_ one! Он обрабатывается в 'BasicTableUI'. – trashgod