Я надеялся, что кто-то мог объяснить что-то мне, когда я нашел свое решение, но я не понимаю, почему оно работает. Я хотел установить рендерер по умолчанию Типом класса к целой таблице, не знающей при создании, где объекты будут в нем.
Я объявил JTable и установил рендерер по умолчанию на это мое собственное, для Calendar
класс так, чтобы любой Calendar
s дал бы значимое представление, не просто a 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
s ожидание они заполняют 0th строку, которая является тем, что я хотел, но что препятствовало тому, чтобы я делал это во-первых?
JTable получает класс столбца из модели. Ответ заключается в реализации AbstractTableModel, предполагая, что это то, на чем вы основываете свою табличную модель. В AbstractTableModel getColumnClass реализован следующим образом: return Object.class;
Таким образом, если вы не переопределите его, объекты столбца всегда будут обрабатываться как Object. Модель не справится с этим автоматически. Вам просто нужно переопределить getColumnClass, этого нет.