Java – изменение средства рендеринга JTable для каждого класса

StackOverflow https://stackoverflow.com/questions/3268162

Вопрос

Я надеялся, что кто-нибудь сможет мне что-то объяснить, когда я нашел решение, но не понимаю, почему оно работает.Я хотел установить рендерер по умолчанию по типу класса для всей таблицы, не зная при создании, где в ней будут находиться объекты.

Я объявил JTable и установил свой собственный рендерер по умолчанию. Calendar класс, так что любой Calendars дало бы значимое представление, а не просто 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, обойти это невозможно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top