Задача:
Добавить в JTable колонку с иконкой, запретить получение фокуса
ячейками этой колонки, т.е. запретить выделение этой колонки,
запретить Tab-переходы к ней, переход осуществлять к следующей ячейке.
Ячейки этой колонки должны выглядеть для пользователя как картинка на форме.
Что делал:
Искал в Web, в т.ч. и на RSDN. К сожалению, лучшее полученное решение —
переписать обработку нажатия клавиш и осуществлять передачу фокуса вручную.
Аналогично, видимо, придется сделать и с выделением мышью. Если нет метода лучше,
так и сделаю, однако хотелось бы найти более стандартный и красивый способ.
Для показывания колонки сделал Renderer, метод getTableCellRendererComponent
которого возвращает JButton с иконкой. Пробовал выключать кнопку с помощью
setEnabled(false), ставить ей setFocusable(false).
Навесил на кнопку FocusListener, включил ее, разрешил получение фокуса.
Оказалось, кнопка фокуса не получает при Tab-переходе на нее и при выборе мышью.
Внимание, вопрос знатокам, кто же получает фокус?
Сделал DummyEditor, который везде возвращает null и false, в т.ч.
getTableCellEditorComponent и isCellEditable. В TableModel для этой колонки
тоже возвращаю isCellEditable false.
Здравствуйте, Стельмах Юрий, Вы писали:
СЮ>Навесил на кнопку FocusListener, включил ее, разрешил получение фокуса. СЮ>Оказалось, кнопка фокуса не получает при Tab-переходе на нее и при выборе мышью. СЮ>Внимание, вопрос знатокам, кто же получает фокус?
Фокус в таблице имеет либо CellEditor либо сама Таблица. Renderer занимается все го лишь отрисовкой ячейки и полноценной компонентой внутри контейнера не является. Поэтому фокус и не получает.
Здравствуйте, Blazkowicz, Вы писали:
B>Фокус в таблице имеет либо CellEditor либо сама Таблица. Renderer занимается все го лишь отрисовкой ячейки и полноценной компонентой внутри контейнера не является. Поэтому фокус и не получает.
B>А вот инструмент чтобы вопросов не возникало: B>
С фокусом ясно, его получает таблица. FocusManager нужная штука, неплохо поможет
при написании собственного обработчика нажатия клавиш и мыши.
Или можно исправить Focus Cycle. Однако все же хотелось бы
использовать стандартные средства, а не заплатку.
Хотелось бы задать какие-нибудь настройки при создании таблицы, и "чтоб оно само".
KeyboardFocusManager man = KeyboardFocusManager.getCurrentKeyboardFocusManager();
Component com = man.getFocusOwner();
// В com лежит объект класса JTable при Tab-переходе на нужную ячейку
Здравствуйте, Стельмах Юрий, Вы писали:
СЮ>Однако все же хотелось бы СЮ>использовать стандартные средства, а не заплатку. СЮ>Хотелось бы задать какие-нибудь настройки при создании таблицы, и "чтоб оно само".
Дык может не стоит тогда зацикливаться на фокусе? Посмотреть как работает Selection у таблицы.
С таблицей не пробовал, но подобную задачу решал с деревом. Переопределял методы SelectionModel. В методах установки/изменения Selection проверял возможен ли выбор заданного узла.
B>Дык может не стоит тогда зацикливаться на фокусе?
Зацикливаться не обязательно. Я хотел узнать, есть ли человеческий метод решения
поставленной в начале обсуждения задачи. По человечески для меня — это
при создании TableColumn указать setBlaBlaBla и после этого радоваться жизни.
Похоже, придется делать Evil Hack
B>Посмотреть как работает Selection у таблицы. B>С таблицей не пробовал, но подобную задачу решал с деревом. Переопределял методы SelectionModel. В методах установки/изменения Selection проверял возможен ли выбор заданного узла.
У таблицы "узлами" Selection являются строки. А мне нужно запретить выделение СТОЛБЦА.
Здравствуйте, Стельмах Юрий, Вы писали:
СЮ>Зацикливаться не обязательно. Я хотел узнать, есть ли человеческий метод решения СЮ>поставленной в начале обсуждения задачи. По человечески для меня — это СЮ>при создании TableColumn указать setBlaBlaBla и после этого радоваться жизни. СЮ>Похоже, придется делать Evil Hack
СЮ>У таблицы "узлами" Selection являются строки. А мне нужно запретить выделение СТОЛБЦА.
Поэтому у таблицы 2 SelectionModel:
B>Поэтому у таблицы 2 SelectionModel:
B>table.getSelectionModel() B>table.getColumnModel().getSelectionModel()
B>Можно их переопределить либо порсто вешать на них слушателей. B>http://javaalmanac.com/egs/javax.swing.table/SelEvent.html
Спасибо. Действительно, 2 модели. Переопределить оказалось несложно,
даже работает.