2015-10-19 4 views
0

У меня есть набор JTable для отображения значений String и Boolean в том же столбце. У меня есть следующий фрагмент кода для настройки рендеринга для обоих типов объектов.Связанный с классом компонент визуализации

table.setDefaultRenderer(Boolean.class, new BooleanHandler()); 
    table.setDefaultRenderer(String.class, new StringHandler()); 
    table.setDefaultRenderer(
      Object.class, 
      new DefaultTableCellRenderer() { 
       @Override 
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
        System.out.println("Inside overridden function"); 
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column); 
       } 
      } 
    ); 

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

ответ

2

У меня есть JTable набор для отображения значений строковых и логических в том же столбце

Тогда вы не можете просто использовать обычную логику рендеринга.

Обычно рендеринг выбирается исходя из значения, возвращаемого методом getColumnClass(...). Однако это основано на столбцах, а не на базе ячеек, поэтому вы не будете знать, какой рендерер будет возвращен.

Вместо этого вам необходимо переопределить методы getCellRenderer(...) и getCellEditor(...) для возврата рендерера/редактора на основе данных в ячейке.

Пример такого подхода приводится ниже:

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 

public class TablePropertyEditor extends JFrame 
{ 
    public TablePropertyEditor() 
    { 
     String[] columnNames = {"Type", "Value"}; 
     Object[][] data = 
     { 
      {"String", "I'm a string"}, 
      {"Date", new Date()}, 
      {"Integer", new Integer(123)}, 
      {"Double", new Double(123.45)}, 
      {"Boolean", Boolean.TRUE} 
     }; 

     JTable table = new JTable(data, columnNames) 
     { 
      private Class editingClass; 

      public TableCellRenderer getCellRenderer(int row, int column) 
      { 
       editingClass = null; 
       int modelColumn = convertColumnIndexToModel(column); 

       if (modelColumn == 1) 
       { 
        Class rowClass = getModel().getValueAt(row, modelColumn).getClass(); 
        return getDefaultRenderer(rowClass); 
       } 
       else 
        return super.getCellRenderer(row, column); 
      } 

      public TableCellEditor getCellEditor(int row, int column) 
      { 
       editingClass = null; 
       int modelColumn = convertColumnIndexToModel(column); 

       if (modelColumn == 1) 
       { 
        editingClass = getModel().getValueAt(row, modelColumn).getClass(); 
        return getDefaultEditor(editingClass); 
       } 
       else 
        return super.getCellEditor(row, column); 
      } 

      // This method is also invoked by the editor when the value in the editor 
      // component is saved in the TableModel. The class was saved when the 
      // editor was invoked so the proper class can be created. 

      public Class getColumnClass(int column) 
      { 
       return editingClass != null ? editingClass : super.getColumnClass(column); 
      } 
     }; 

     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     TablePropertyEditor frame = new TablePropertyEditor(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

Приведенный выше код просто использует строку по умолчанию и булевы рендеры и редакторов.

Другим подходом было бы создание собственных средств визуализации и редакторов, чтобы каждый из них знал о двух возможных типах данных и возвращал соответствующий рендерер/редактор.

+0

Удаление моего ответа в пользу этого. 1+. –

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