Запретить получение фокуса колонкой JTable
От: Стельмах Юрий Россия  
Дата: 01.08.05 07:35
Оценка:
Задача:
Добавить в JTable колонку с иконкой, запретить получение фокуса
ячейками этой колонки, т.е. запретить выделение этой колонки,
запретить Tab-переходы к ней, переход осуществлять к следующей ячейке.
Ячейки этой колонки должны выглядеть для пользователя как картинка на форме.

Что делал:
Искал в Web, в т.ч. и на RSDN. К сожалению, лучшее полученное решение —
переписать обработку нажатия клавиш и осуществлять передачу фокуса вручную.
Аналогично, видимо, придется сделать и с выделением мышью. Если нет метода лучше,
так и сделаю, однако хотелось бы найти более стандартный и красивый способ.

Для показывания колонки сделал Renderer, метод getTableCellRendererComponent
которого возвращает JButton с иконкой. Пробовал выключать кнопку с помощью
setEnabled(false), ставить ей setFocusable(false).

Навесил на кнопку FocusListener, включил ее, разрешил получение фокуса.
Оказалось, кнопка фокуса не получает при Tab-переходе на нее и при выборе мышью.
Внимание, вопрос знатокам, кто же получает фокус?

Сделал DummyEditor, который везде возвращает null и false, в т.ч.
getTableCellEditorComponent и isCellEditable. В TableModel для этой колонки
тоже возвращаю isCellEditable false.



Код CellRenderer'а


package datawindow;

import java.awt.Component;
import java.awt.Insets;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.HashMap;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class IconRenderer extends ThemeRenderer
implements TableCellRenderer, FocusListener{
private HashMap m_icons;
private JButton m_btn;

public IconRenderer(Datawindow dw, HashMap icons){
super(dw);
m_icons = icons;
m_btn = new JButton();
m_btn.setBorderPainted(false);
m_btn.setOpaque(true);
m_btn.setMargin(new Insets(0, 0, 0, 0));
m_btn.setFocusable(false);
m_btn.setEnabled(false);
m_btn.addFocusListener(this);
}

public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int rownum, int colnum) {
ImageIcon icon = (ImageIcon) m_icons.get(value);
m_btn.setIcon(icon);
m_btn.setDisabledIcon(icon);
m_btn.setToolTipText((String)value);
return m_btn;
}

public void focusGained(FocusEvent fe) {
System.out.println("focus gained");

}

public void focusLost(FocusEvent arg0) {
}
}
Re: Запретить получение фокуса колонкой JTable
От: Blazkowicz Россия  
Дата: 01.08.05 09:40
Оценка: 2 (1)
Здравствуйте, Стельмах Юрий, Вы писали:

СЮ>Навесил на кнопку FocusListener, включил ее, разрешил получение фокуса.

СЮ>Оказалось, кнопка фокуса не получает при Tab-переходе на нее и при выборе мышью.
СЮ>Внимание, вопрос знатокам, кто же получает фокус?

Фокус в таблице имеет либо CellEditor либо сама Таблица. Renderer занимается все го лишь отрисовкой ячейки и полноценной компонентой внутри контейнера не является. Поэтому фокус и не получает.

А вот инструмент чтобы вопросов не возникало:
FocusManager currentManager = FocusManager.getCurrentManager();
currentManager.getFocusOwner();
Re[2]: Запретить получение фокуса колонкой JTable
От: Стельмах Юрий Россия  
Дата: 01.08.05 11:02
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Фокус в таблице имеет либо CellEditor либо сама Таблица. Renderer занимается все го лишь отрисовкой ячейки и полноценной компонентой внутри контейнера не является. Поэтому фокус и не получает.


B>А вот инструмент чтобы вопросов не возникало:

B>
B>FocusManager currentManager = FocusManager.getCurrentManager();
B>currentManager.getFocusOwner();
B>


С фокусом ясно, его получает таблица. FocusManager нужная штука, неплохо поможет
при написании собственного обработчика нажатия клавиш и мыши.
Или можно исправить Focus Cycle. Однако все же хотелось бы
использовать стандартные средства, а не заплатку.
Хотелось бы задать какие-нибудь настройки при создании таблицы, и "чтоб оно само".

KeyboardFocusManager man = KeyboardFocusManager.getCurrentKeyboardFocusManager();
Component com = man.getFocusOwner();
// В com лежит объект класса JTable при Tab-переходе на нужную ячейку
Re[3]: Запретить получение фокуса колонкой JTable
От: Blazkowicz Россия  
Дата: 01.08.05 11:34
Оценка: 3 (1)
Здравствуйте, Стельмах Юрий, Вы писали:

СЮ>Однако все же хотелось бы

СЮ>использовать стандартные средства, а не заплатку.
СЮ>Хотелось бы задать какие-нибудь настройки при создании таблицы, и "чтоб оно само".

Дык может не стоит тогда зацикливаться на фокусе? Посмотреть как работает Selection у таблицы.
С таблицей не пробовал, но подобную задачу решал с деревом. Переопределял методы SelectionModel. В методах установки/изменения Selection проверял возможен ли выбор заданного узла.
Re[4]: Запретить получение фокуса колонкой JTable
От: Стельмах Юрий Россия  
Дата: 01.08.05 13:59
Оценка:
B>Дык может не стоит тогда зацикливаться на фокусе?
Зацикливаться не обязательно. Я хотел узнать, есть ли человеческий метод решения
поставленной в начале обсуждения задачи. По человечески для меня — это
при создании TableColumn указать setBlaBlaBla и после этого радоваться жизни.
Похоже, придется делать Evil Hack

B>Посмотреть как работает Selection у таблицы.

B>С таблицей не пробовал, но подобную задачу решал с деревом. Переопределял методы SelectionModel. В методах установки/изменения Selection проверял возможен ли выбор заданного узла.

У таблицы "узлами" Selection являются строки. А мне нужно запретить выделение СТОЛБЦА.
Re[5]: Запретить получение фокуса колонкой JTable
От: Blazkowicz Россия  
Дата: 01.08.05 14:15
Оценка: 2 (1)
Здравствуйте, Стельмах Юрий, Вы писали:

СЮ>Зацикливаться не обязательно. Я хотел узнать, есть ли человеческий метод решения

СЮ>поставленной в начале обсуждения задачи. По человечески для меня — это
СЮ>при создании TableColumn указать setBlaBlaBla и после этого радоваться жизни.
СЮ>Похоже, придется делать Evil Hack



СЮ>У таблицы "узлами" Selection являются строки. А мне нужно запретить выделение СТОЛБЦА.

Поэтому у таблицы 2 SelectionModel:

table.getSelectionModel()
table.getColumnModel().getSelectionModel()

Можно их переопределить либо порсто вешать на них слушателей.
http://javaalmanac.com/egs/javax.swing.table/SelEvent.html
Re[6]: Запретить получение фокуса колонкой JTable
От: Стельмах Юрий Россия  
Дата: 02.08.05 10:21
Оценка:
B>Поэтому у таблицы 2 SelectionModel:

B>table.getSelectionModel()

B>table.getColumnModel().getSelectionModel()

B>Можно их переопределить либо порсто вешать на них слушателей.

B>http://javaalmanac.com/egs/javax.swing.table/SelEvent.html

Спасибо. Действительно, 2 модели. Переопределить оказалось несложно,
даже работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.