Запретить получение фокуса колонкой 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) {
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.