2013-08-05 1 views
1

Я пытаюсь реализовать JTable, который будет форматировать ячейки в столбцах способами, зависящими от их типа. Для этого я реализую метод getTableCellRendererComponent() для TableCellRenderer.JTable TableCellRenderer getTableCellRendererComponent() никогда не вызывал

Проблема в том, что мой метод getTableCellRendererComponent() никогда не называется, поскольку тестовый вывод в коде никогда не появляется в консоли.

Вот код для визуализатора:

public class MenuSheetTableCellRenderer extends JLabel implements TableCellRenderer { 

@Override 
public Component getTableCellRendererComponent(
         JTable table, Object value, 
         boolean isSelected, boolean hasFocus, 
         int row, int column){ 

JLabel label = new JLabel(); 

System.out.println("test"); 
if(value instanceof GregorianCalendar){ 
    System.out.println("test2"); 
    GregorianCalendar timeGregorianCalendar = (GregorianCalendar) value; 
    Date time = timeGregorianCalendar.getTime(); 
    SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm a"); 
    String mealTime = timeFormat.format(time); 

    label.setText(mealTime); 
} 

else if(value instanceof MealChoice){ 
    label.setText(value.toString()); 
} 
else if(value instanceof Recipe){ 
    label.setText("  " + value.toString()); 
} 
if (value instanceof String || value instanceof MealChoice){ 
    label.setFont(new Font("Tahoma", Font.BOLD, 11)); 
} 

return label; 
} 

}

Вот код (отредактированный для соответствующего кода), который генерирует таблицу. Обратите внимание, что getRows() - это мой настраиваемый метод, который возвращает данные для визуализации, а также то, что я использую netbeans (следовательно, сокращенный метод initComponents()). Должно быть, не имеет значения.

private void initComponents() { 
menuSheetTable = new javax.swing.JTable(); 
menuSheetTable.setModel(new javax.swing.table.DefaultTableModel(
     new Object [][] { 

     }, 
     new String [] { 

     } 
    )); 
    menuSheetTable.setEnabled(false); 
    menuSheetTable.setFocusable(false); 
    menuSheetTable.setShowHorizontalLines(false); 
    menuSheetTable.setShowVerticalLines(false); 
    jScrollPane1.setViewportView(menuSheetTable); 
} 

public void renderTable(){ 

String[] columns = { "Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; 
Object[][] rows = getRows(); 

DefaultTableModel menuSheetModel = new DefaultTableModel(rows, columns); 
menuSheetTable.setModel(menuSheetModel); 

MenuSheetTableCellRenderer renderer = new MenuSheetTableCellRenderer(); 
try{ 
    menuSheetTable.setDefaultRenderer(Class.forName("java.lang.String"), renderer); 
    menuSheetTable.setDefaultRenderer(Class.forName("java.util.GregorianCalendar"), renderer); 
    menuSheetTable.setDefaultRenderer(Class.forName("MenuSystemManager.MealChoice"), renderer); 
    menuSheetTable.setDefaultRenderer(Class.forName("MenuSystemManager.Recipe"), renderer); 
} 
catch(ClassNotFoundException e){ 
    System.exit(1); 
} 
} 

ответ

2

Код, заданный средством визуализации по умолчанию, не имеет зарегистрированного объекта Object. Поскольку rows[][] был объявлен типом «Объект», визуализатор никогда не вызывался, потому что он был передан Object объектам, а не GregorianCalendar s, String s, или Recipe s.

0

Я столкнулся с тем же вопросом. Ну, вы уже нашли причину, по которой она ведет себя так. Итак, вот решение.

JTable работает с интерфейсом TableModel, который предоставляет таблицу со всей информацией о хранящихся ею данных. Эта информация также содержит класс, связанный с столбцом. Итак, в основном, вам нужно получить TableModel или AbstractTableModel с вашим классом, который будет хранить данные для таблицы и переопределять метод public Class<?> getColumnClass(int columnIndex). После этого улучшения вы можете использовать свой заказ TableCellRenderer. В вашем коде вы указали JTable с DefaultTableModel, который возвращает Object для любого столбца, и поэтому он не сработал.

Смежные вопросы