Реализация возможности выбора цвета в ячейке JTable с помощью JComboBox
Разработан алгоритм и предложено программное решение средствами языка Java2, заливки и отображения цвета в ячейке таблицы объекта библиотеки Swing JTable. Предложен способ решения данной задачи с использованием "легковесного" компонента JcomboBox.
Данная задача возникла при построении графика полиномиальной функции на симлпекс - плане для заданных значений отклика, которые необходимо для удобства выделять различными цветами. Исходными данными для построения являются: количество уровней отклика функции, значение по каждому уровню и цвет которым необходимо отображать соответствующий уровень на симплекс плане. Эти параметры задаются в окне диалога (см. рис. 1) и передаются в соответствующий класс, который выполняет построение.
Рисунок 1. Задание начальных параметров для построения линий уровня
Как видно из рис1. данные помещаются в объект JTable, поэтому при отображении цвета уровня в таблице необходимо решить следующие задачи:
- Отображать соответствующий цвет заливки в ячейке таблицы;
- Обеспечить возможность изменения цвета заливки.
Заполнение таблицы происходит в цикле, и цвет задается следующим образом:
Color cl = new Color((int)(Math.random()*256),
(int)(Math.random()*256),
(int)(Math.random()*256));
Далее объект Color заносится в ячейку таблицы, и для того, чтобы в ячейке был показан цвет, необходимо переопределить метод setValue(), класса DefaultTableCellRenderer, который отвечает за непосредственный вывод содержимого ячейки на экран. Данная задача является довольно тривиальной и ее решение можно найти во многих источниках.
Так как при предложенном методе заполнения таблицы не исключена вероятность появления дух одинаковых цветов, или разных оттенков одного цвета в столбце, то необходимо как-то их изменять. Из имеющихся стандартных решений, наиболее предпочтительным, является вариант с использованием объекта JСolorChooser, который обладает довольно мощными возможностями по настройке параметров цвета. Однако я посчитал, что в моем случае необходимо использовать более простое решение, например поле со списком (объект JComboBox) элементами которого были бы объекты Color. Однако в этом случае я столкнулся с проблемой вывода цвета в список, так как вывод элемента списка осуществляется методом toString().
Данная проблема была решена следующим образом. Был создан класс, состоящий из двух полей, объекты типа Color и String, в котором был переопределен метод toString():
class NamedColor extends Color {
String name;
Color color;
public NamedColor(Color color, String name) {
super(color.getRGB());
this.color = color;
this.name = name;
}
public Color getTextColor() {
return color;
}
public String toString() {
return name;
}
}
Далее был создан класс отвечающий за визуализацию элементов списка:
class ComboRenderer extends JLabel implements ListCellRenderer {
public ComboRenderer()
{
setOpaque(true);
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean f) {
NamedColor c = (NamedColor) value;
setBackground(c);
setText(c.toString());
return this;
}
}
В этом классе устанавливается соответствующий цвет заливки элемента списка. После этого осталось только реализовать метод создания и заполнения объекта JComboBox и связать его с соответствующей таблицей:
public void setComboBox(TableColumn tabCol){
JComboBox comboBox = new JComboBox();
for (int i=1;i<100;i++){
comboBox.addItem(new NamedColor((new Color(
(int)(Math.random()*256),
(int)(Math.random()*256),
(int)(Math.random()*256)))," "));
}
tabCol.setCellEditor(new DefaultCellEditor(comboBox));
comboBox.setToolTipText("Выбор цвета");
comboBox.setRenderer(new ComboRenderer());
tabCol.setCellRenderer(new ColorRenderer());
}
В итоге диаграмма выглядит следующим образом рисунок 2:
Realization of an opportunity of a choice of color in cell JTable with help JComboBox.
The algorithm is developed and the program decision means of language Java2, заливки and displays of color in a cell of the table of object of library Swing JTable is offered. The way of the decision of the given problem with use of "superficial" component JcomboBox is offered.
Окончил технологический факультет ДГТУ (1993).
доцент кафедры «Информатика» ДГТУ,
кандидат технических наук (1996).
ДГТУ г.Ростов-на-Дону
Январь 2005г.