Реализация возможности выбора цвета в ячейке 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.
Источник:
Автор: ЖМАЙЛОВ Борис Борисович (р.1971)