Java – изменение средства рендеринга JTable для каждого класса
-
16-09-2020 - |
Вопрос
Я надеялся, что кто-нибудь сможет мне что-то объяснить, когда я нашел решение, но не понимаю, почему оно работает.Я хотел установить рендерер по умолчанию по типу класса для всей таблицы, не зная при создании, где в ней будут находиться объекты.
Я объявил JTable и установил свой собственный рендерер по умолчанию. Calendar
класс, так что любой Calendar
s дало бы значимое представление, а не просто toString()
из себя.
JTable table = new JTable();
table.setDefaultRenderer(Calendar.class, new MyRenderer());
public class MyRenderer extends DefaultTableCellRenderer{
public MyRenderer() { super(); }
@Override
public void setValue(Object value){
setText(makeCalendarToDate((GregorianCalendar)value));
}
}
Это не сработает, пока я не переопределю метод getColumnClass
как было сделано Здесь
По данным Солнца Документация, это выглядит как getColumnClass
должен делать именно то, что было переопределено в примере, который я привел выше. Почему это работает, когда я переопределяю этот метод, но не когда я оставляю стандартную реализацию?
Теперь я могу заполнить столбцы Calendar
в ожидании они заполняют 0-ю строку, чего я и хотел, но что вообще помешало мне сделать это?
Решение
JTable получает класс столбца из модели.Ответ заключается в реализации AbstractTableModel, если предположить, что это то, на чем вы основываете свою табличную модель.В AbstractTableModel getColumnClass реализован следующим образом: return Object.class;
Таким образом, если вы не переопределите это, объекты столбцов всегда будут обрабатываться как Object.Это не то, что модель будет обрабатывать автоматически.Вам просто нужно переопределить getColumnClass, обойти это невозможно.