2016-12-14 5 views
0

Как определить тип данных (String, Integer, Double и т. Д.) Ссылки на таблицу table javafx. Например. У меня есть пользовательские ячейки завод, который назначен на поле в контроллере JavaFX следующим образом:JavaFx - Получить тип данных TableCell

CustomCellFactory<Damageloop, Date> damageLoopWorkshopDueDateFactory = new CustomCellFactory ("colDamageLoopWorkshopDueDate", false); 

Это вызывает следующий класс ...

public class CustomCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { 

    String colname; 
    boolean editable; 

    public CustomCellFactory (String colname, boolean editable) { 
     this.colname = colname; 
     this.editable = editable; 
    } 

    @Override 
    public TableCell<S, T> call(TableColumn<S, T> arg) { 
     TableCell<S, T> cell; 
     if (editable == true) { 
      cell = new TableCellEditable<>(colname); 
     } else { 
      cell = new TableCellCustom<>(colname); 
     } 
     return cell; 
    } 

} 

Который в свою очередь, вызывает следующий класс .. .

public class TableCellCustom <S, T> extends TableCell<S, T> { 

    String colname; 

    public TableCellCustom (String colname) { 
     this.colname = colname; 
    } 

    @Override 
    protected void updateItem(T item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty || item == null) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      setConditionalFormatting(this,item); 
     } 
    } 

    public void setConditionalFormatting (TableCell<S,T> cell, T item) { 
     //perform specific cell formatting.... 
    } 
} 

И хотел бы, чтобы определить тип данных ячейки на уровне TableCellCustom (т.е. начальный параметр, который передается при создании CustomCellFactory, в данном случае дата) так зр На основе этого могут быть выполнены особые операции. Я попытался ...

super.itemProperty().getName() 

И это возвращает целую кучу информации, связанной с ячейкой следующим образом:

ObjectProperty [bean: EditableTableCell[id=colDamageLoopWorkshopDueDate, styleClass=cell indexed-cell table-cell table-column]'17/01/2016', name: item, value: 2016-01-17] 

Но нет ссылки на ячейки типа данных.

+0

Можете ли вы дать немного больше контекста здесь? Ответ книги состоит в том, что тип данных - 'T', но я предполагаю, что это не то, что вы имеете в виду ... –

+0

@James_D обновлен, чтобы предоставить больше контекста. И я определенно не после T! – Josh

ответ

2

Значение типа переменной T удаляются во время компиляции: по существу T заменяются Object и возвращаемые значения T заменена соответствующим бросок. Таким образом, во время выполнения нет способа найти тип T в конкретном экземпляре вашего класса.

Так что если вам действительно нужно получить доступ к этой информации, вам нужно добавить поле для представления типа. То есть вам нужно:

public class TableCellCustom <S, T> extends TableCell<S, T> { 

    // the type of T: 
    private final Class<T> type ; 

    String colname; 

    public TableCellCustom (String colname, Class<T> type) { 
     this.colname = colname; 
     this.type = type ; 
    } 

    @Override 
    protected void updateItem(T item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty || item == null) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      setConditionalFormatting(this, item); 
     } 
    } 

    public void setConditionalFormatting (TableCell<S,T> cell, T item) { 
     //perform specific cell formatting.... 
     if (type == Date.class) { 
      // ... 
     } else { 
      // ... 
     } 
    } 
} 

Конечно, чтобы сделать эту работу, вам также необходимо

public class CustomCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { 

    String colname; 
    boolean editable; 

    private final Class<T> type ; 

    public CustomCellFactory (String colname, boolean editable, Class<T> type) { 
     this.colname = colname; 
     this.editable = editable; 
     this.type = type ; 
    } 

    @Override 
    public TableCell<S, T> call(TableColumn<S, T> arg) { 
     TableCell<S, T> cell; 
     if (editable == true) { 
      cell = new TableCellEditable<>(colname); 
     } else { 
      cell = new TableCellCustom<>(colname, type); 
     } 
     return cell; 
    } 

} 

, а затем вы

CustomCellFactory<Damageloop, Date> damageLoopWorkshopDueDateFactory = 
    new CustomCellFactory ("colDamageLoopWorkshopDueDate", false, Date.class); 
+0

Большой всеобъемлющий ответ. Благодаря! – Josh

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