Изменение цвета ячейки JTable
Это сводит меня с ума.
Я знаю, что для изменения форматирования ячеек таблицы с помощью JTable мне нужно использовать собственный рендер. Но я не могу реализовать это должным образом.
Это моя текущая настройка:
public class MyClass
{
public static void main(String args[])
{
JTable myTable = new JTable(10, 10);
myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
}
}
class CustomRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
// Formatting
return c;
}
}
Что мне нужно использовать для первого параметра setDefaultRenderer
? API просто говорит "класс". Понятия не имею, что там поставить.
Может ли кто-нибудь просто объяснить, в простейших терминах, как я реализую это? Пожалуйста, приведите пример того, как я могу изменить форматирование из main()
метод также.
1 ответ
В первом параметре для setDefaultRenderer
, поместите литерал класса для класса, который вы хотите переопределить рендеринг. Т.е. если ваши данные состоят из всех строк, вы можете поставить
myTable.setDefaultRenderer(String.class, new CustomRenderer());
Если ваши данные также состоят из значений с BigDecimal
или же Integer
как классы, вы должны вызывать этот метод несколько раз для каждого типа класса (BigDecimal.class
или же Integer.class
в каждом случае).
И, наконец, чтобы изменить цвет фона, вы делаете это в вашем рендерере:
class CustomRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(new java.awt.Color(255, 72, 72));
return c;
}
}
Если вы напишете средство визуализации, которое должно работать для всех классов интерфейса, вам также потребуется изменить getColumnClass
функция вашей табличной модели и пусть она возвращает класс интерфейса для всех объектов, которые реализуют этот интерфейс:
public Class<? extends Object> getColumnClass(int c) {
Object object = getValueAt(0, c);
if(object == null) {
return Object.class;
if(getValueAt(0, c) instanceof IColorable) {
return ICarPart.class;
} else {
return getValueAt(0, c).getClass();
}
}
При этом можно зарегистрировать средство визуализации для IColorable.class и не нужно регистрировать отдельное средство визуализации для каждой реализации.