如何在列上添加列?

How can i get columns added on column?

下面是我的代码...

   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。

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

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

我认为必须更改此代码... 有人有想法吗??

嵌套列不是 TableView.columns 列表的一部分。

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

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

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

此外,如果项目 class 的 PropertyValueFactory returns 属性,您可以使用此 属性 设置值而不是使用反射:

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]);
}