2015-08-11 6 views
1

в моем настраиваемом JTable У меня есть несколько столбцов. Один столбец имеет тип java.sql.Timestamp. Я хочу изменить цвет фона всех ячеек, и я хочу изменить формат только элементов Timestamp. Я сделал следующее customcellrenderer, которую я называю по:Как изменить фон и формат ячейки в JTable

for(int i = 0; i < tableTask.getColumnCount(); i++) 
{ 
    Class columnClass = myTaskTM.getColumnClass(i); 
    TableCellRenderer defaultRenderer = tableTask.getDefaultRenderer(columnClass); 
    tableTask.getColumnModel().getColumn(i).setCellRenderer(new CustomRenderer(defaultRenderer)); 
} 

customrenderer:

public class CustomRenderer extends DefaultTableCellRenderer 
{ 
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
    TableCellRenderer delegate; 

    public CustomRenderer(TableCellRenderer defaultRenderer) 
    { 
     super(); 
     delegate = defaultRenderer; 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component c = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     Color foreground, background; 

     if(!isSelected) 
     { 
      ... 
     } 
     else 
     { 
      background = javax.swing.UIManager.getDefaults().getColor("Table.selectionBackground"); 
      //foreground = javax.swing.UIManager.getDefaults().getColor("Table.selectionForeground"); 
      foreground = Color.BLACK; 
     } 

     c.setForeground(foreground); 
     c.setBackground(background); 

     setValue(value); 

     return c; 
    } 

    @Override 
    public void setValue(Object value) { 
     if (formatter == null) { 
      formatter = DateFormat.getDateInstance(); 
     } 
     if(value != null) 
     { 
      if(value.getClass().toString().equals("class java.sql.Timestamp")) 
      { 
       ((JLabel)delegate).setText((value == null) ? "" : formatter.format(value)); 
      } 
      else 
      { 
       ((JLabel)delegate).setText(value.toString()); 
      } 
     } 
    } 
} 

SetValue работает только тогда, когда getTableCellRendererComponent закомментирована.

Как я могу заставить обоих работать?

ответ

1

setValue() должен позвонить delegate.setText(), потому что компонент делегата фактически используется. Также я даже не вижу, где в рендерере вызывается setValue().

Назовите это в своем рендерере, пройдя Object value.

+0

Делегат не имеет опции setText. Я получаю сообщение об ошибке: не могу найти символ – KJVA

+0

Передача в JLabel (или даже в DefaultTableCellRenderer) ((JLabel) delegate) .setText() – StanislavL

+0

Большое спасибо StanislavL! Я обновил свой код с вашими комментариями – KJVA

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