如何在列上添加列?

时间:2016-09-08 04:58:31

标签: javafx tableview tablecolumn

下面是我的代码......

   TableColumn tc = new TableColumn();
    TableColumn[] tc2 = new TableColumn[10];
    for(int i=0; i<5, i++){
      tc.getColumns().add(tc2[i]);
      }

我尝试覆盖用于编辑单元格的提交方法。

public void commit(Object val) {

    // Get the table
    TableView<MainTable> t = this.getTableView();

    // Get the selected row/column

    MainTable selectedRow = t.getItems().get(this.getTableRow().getIndex());    
    TableColumn<MainTable, ?> selectedColumn = t.getColumns().get(t.getColumns().indexOf(this.getTableColumn()));

    // Get current property name
    String propertyName = ((PropertyValueFactory) selectedColumn.getCellValueFactory()).getProperty();

    // Create a method name conforming to java standards ( setProperty )
    propertyName = ("" + propertyName.charAt(0)).toUpperCase() + propertyName.substring(1);

    // Try to run the update
    try {

        // Type specific checks - could be done inside each setProperty() method
        if(val instanceof Double) {
            Method method = selectedRow.getClass().getMethod("set" + propertyName, double.class);
            method.invoke(selectedRow, (double) val);
        }
        if(val instanceof String) {
            Method method = selectedRow.getClass().getMethod("set" + propertyName, String.class);
            method.invoke(selectedRow, (String) val);
        }
        if(val instanceof Integer) {
            Method method = selectedRow.getClass().getMethod("set" + propertyName, int.class);
            method.invoke(selectedRow, (int) val);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    // CommitEdit for good luck
    commitEdit((String) val);
}

我在控制台视图上得到了ArrayIndexOutofBoundsException。

所以我的问题是 如何选择getcolumns添加其他列???

TableColumn<MainTable, ?> selectedColumn = t.getColumns().get(t.getColumns().indexOf(this.getTableColumn()));

我认为这段代码必须改变...... 有人有想法吗?

1 个答案:

答案 0 :(得分:2)

嵌套列不属于TableView.columns列表。

如果您需要相应的TableView列,只需浏览层次结构,直到找到没有parentColumn的列:

TableColumn<MainTable, ?> selectedColumn = this.getTableColumn();
TableColumn<MainTable, ?> c = selectedColumn;
while ((c = selectedColumn.getParentColumn()) != null) {
    selectedColumn = c;
}

如果您只需要列本身,只需使用this.getTableColumn(),而不是在columns列表中查找列的索引,然后在同一列表中访问该索引。 (我想后者就是你所需要的。)

此外,如果PropertyValueFactory返回项类的属性,则可以使用此属性设置值而不是使用反射:

ObservableValue obs = selectedColumn.getCellObservableValue(this.getIndex());
if (obs instanceof WritableValue) {
    ((WritableValue) obs).setValue(val);
} else {
    // reflecitive approach
}

此外,您不应将null添加为嵌套列,但是您在此处执行此操作:

TableColumn[] tc2 = new TableColumn[10];
for(int i=0; i<5, i++){
    tc.getColumns().add(tc2[i]);
}