2016-12-14 82 views
0

如何確定javafx tablecell引用的數據類型(String,Integer,Double等)。例如。我有如下分配給場中一個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時通過,在這種情況下的日期初始參數),以便SP基於此可以執行特殊操作。我曾嘗試...

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