首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按字段复制TableView字段(以修改该字段)

按字段复制TableView字段(以修改该字段)
EN

Stack Overflow用户
提问于 2017-05-04 10:28:48
回答 1查看 37关注 0票数 0

我想逐个复制TableView单元格,这样以后我就可以修改它了。由于无法实例化TableColumn,因此不知道如何设置列,所以我被困住了。我不知道如何处理rowHeader,也不知道如何以不同的方式处理它。

代码语言:javascript
复制
public TableView<ObservableMap<String, CellDescriptor>> copyTableViewDeleteRow(int j)
{
    //FIXME
    TableView<ObservableMap<String, CellDescriptor>> tableViewCopy = new TableView<ObservableMap<String, CellDescriptor>> ();

    ObservableList<TableColumn<ObservableMap<String, CellDescriptor>, ?>> columns = tableView.getColumns();

    ObservableList<TableColumn<ObservableMap<String, CellDescriptor>, ?>> columnsNew = 
            tableViewCopy.getColumns();

    ListOrderedMap<String, CellDescriptor> rowHeader = new ListOrderedMap<>();

    int rowIndex = 0;
    int columnIndex = 0;
    for (TableColumn<?, ?> column : columns) {
        String cell = column.getText();
        String key = COLUMN_KEY_PREFIX + Integer.toString(columnIndex);
        CellDescriptor cd = new CellDescriptor(columnIndex, rowIndex, cell, this);
        rowHeader.put(key, cd);
        //TODO ? cannot instantiate TableColumn
        TableColumn<ObservableMap<String, CellDescriptor>, ?> columnNew = 
                //new TableColumn<ObservableList<String>, CellDescriptor>(key, cd);
                new TableColumn<ObservableMap<String, CellDescriptor>, ?>(cd);

        ++columnIndex;
    }

    ObservableList<ObservableMap<String, CellDescriptor>> itemsNew =
            tableViewCopy.getItems();

    ++rowIndex;
    for (Object row : tableView.getItems()) {
        ObservableMap<String, CellDescriptor> e = FXCollections.observableMap(new HashMap<String, CellDescriptor>());

        columnIndex = 0;
        for (TableColumn column : columns) {

            CellDescriptor cd = (CellDescriptor) column.getCellObservableValue(row).getValue();
            CellDescriptor cdNew = cd.clone();

            if(rowIndex == 1 && columnIndex == 1)
                cdNew.setText("xxx");

            e.put(COLUMN_KEY_PREFIX + columnIndex, cdNew);

            ++columnIndex;
        }

        itemsNew.add(e);

        ++rowIndex;
    }       

    System.out.println("tableViewCopy columns size=" + tableViewCopy.getColumns().size()); // is zero
    System.out.println("tableViewCopy items size=" + tableViewCopy.getItems().size()); // is three

    return tableViewCopy;
}

我好像错过了这些柱子,因为它们的大小是零。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-04 11:24:19

我通过将行写入数据对象来解决这个问题,然后使用从数据对象创建tableView的现有函数。职能如下:

代码语言:javascript
复制
protected TableView<ObservableMap<String, CellDescriptor>> createTableView(TableFile tableFile)
{
    int columns = tableFile.getColumnCount();
    int rows = tableFile.getRowCount();

    ObservableList<ObservableMap<String, CellDescriptor>> data = FXCollections.observableArrayList();

    for (int i = 1; i < rows; i++)
    {
        ListOrderedMap<String, CellDescriptor> row = tableFile.getRow(i);
        ObservableMap<String, CellDescriptor> oRow = FXCollections.observableMap(row);
        data.add(oRow);
    }

    TableView<ObservableMap<String, CellDescriptor>> tableView = new TableView<>();
    tableView.setEditable(true);
    Callback<TableColumn<ObservableMap<String, CellDescriptor>, CellDescriptor>, TableCell<ObservableMap<String, CellDescriptor>, CellDescriptor>> cellFactory
        = (TableColumn<ObservableMap<String, CellDescriptor>, CellDescriptor> param) -> new ContextMenuCell();
    for (int i = 0; i < columns; i++)
    {
        String name = tableFile.getHeaderCell(i);
        String key = tableFile.getKey(i);
        TableColumn<ObservableMap<String, CellDescriptor>, CellDescriptor> tc = new TableColumn<>(name);
        tc.setCellValueFactory(new ObservableMapValueFactory<String, CellDescriptor>(key));
        tc.setCellFactory(cellFactory);
        tc.setOnEditCommit(
                (TableColumn.CellEditEvent<ObservableMap<String, CellDescriptor>, CellDescriptor> event) ->
                {
                    ObservableMap<String, CellDescriptor> map = event.getTableView().getItems().get(event.getTablePosition().getRow());
                    int ii = event.getOldValue().getI();
                    int jj = event.getOldValue().getJ();
                    String text = event.getNewValue().getText();
                    TableFile tf = event.getOldValue().getTf();
                    CellDescriptor newValue = new CellDescriptor(ii, jj, text, tf);
                    map.put(key, newValue);
                });
        ContextMenu columnContextMenue = createColumnContextMenu(i);
        tc.setContextMenu(columnContextMenue);
        tableView.getColumns().add(tc);
    }

    tableView.setItems(data);
    return tableView;
}

数据对象如下所示:

代码语言:javascript
复制
        ArrayList<ListOrderedMap<String, CellDescriptor>> newData = new ArrayList<>();

现填写如下:

代码语言:javascript
复制
public void copyTableViewDeleteRow(int j)
{
    ArrayList<ListOrderedMap<String, CellDescriptor>> newData = new ArrayList<>();

    //TODO
    ObservableList<TableColumn<ObservableMap<String, CellDescriptor>, ?>> columns = tableView.getColumns();

    ListOrderedMap<String, CellDescriptor> rowHeader = new ListOrderedMap<>();

    int rowIndex = 0;
    int columnIndex = 0;
    for (TableColumn<?, ?> column : columns) {
        String cell = column.getText();
        String key = COLUMN_KEY_PREFIX + Integer.toString(columnIndex);
        CellDescriptor cd = new CellDescriptor(columnIndex, rowIndex, cell, this);
        rowHeader.put(key, cd);

        ++columnIndex;
    }

    newData.add(rowHeader);     

    ObservableList<ObservableMap<String, CellDescriptor>> items =
            tableViewCopy.getItems();

    ++rowIndex;
    for (Object row : tableView.getItems()) {
        ListOrderedMap<String, CellDescriptor> newRow = new ListOrderedMap<>();

        columnIndex = 0;
        for (TableColumn column : columns) {

            CellDescriptor cd = (CellDescriptor) column.getCellObservableValue(row).getValue();
            CellDescriptor cdNew = cd.clone();

            if(rowIndex == 1 && columnIndex == 1)
                cdNew.setText("xxx");

            newRow.put(COLUMN_KEY_PREFIX + columnIndex, cdNew);
            ++columnIndex;
        }

        items.add(e);
        newData.add(newRow);

        ++rowIndex;
    }       

    this.data = newData;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43780359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档