0

私はこのツリーテーブルを作成しています ツリーテーブル

次に、子の値を合計し、関連する列の下の親セルに結果を表示します。たとえば、列 2 と行 2 の関数 7 の場合は右に 2.0 し、関数 11 の場合は列 4 行 4 右に 1.0 (関数 12 + 関数 13)

ツリーテーブルを生成するコードは次のとおりです。

    root.setExpanded(true);
    Set<String> combinedKeys = new HashSet<>(dc.getCombiFunc().keySet());
    Set<String> funcAllKeys = new HashSet<>(dc.getSortedfuncAll().keySet());
    funcAllKeys.removeAll(dc.getCombiFunc().keySet());
    for (List<String> value : dc.getCombiFunc().values()) {
        funcAllKeys.removeAll(value);
    }
    for (String valueremained : funcAllKeys) {
        ArrayList<String> tempNameId = new ArrayList<>();
        tempNameId.add(dc.getSortedfuncAll().get(valueremained));
        // all elements which are not in combined functions (They are all
        // orphan)
        root.getChildren().add(new TreeItem<String>(tempNameId.get(0)));
    }

    // Getting Keys that have children//////
    Set<String> keyFromcombined = new HashSet<>();
    List<String> valueOfCombined = new ArrayList<String>();
    for (Entry<String, List<String>> ent : dc.getCombiFunc().entrySet()) {
        for (int i = 0; i < ent.getValue().size(); i++)
            valueOfCombined.add(ent.getValue().get(i));
    }
    List<String> rootKeyList = new ArrayList<>();
    for (String key : combinedKeys) {

        if (!valueOfCombined.contains((key))) {

            keyFromcombined.add(dc.getFuncAll().get(key));
            rootKeyList.add(key);
        }
    }
    String[] rootKeys = rootKeyList.toArray(new String[rootKeyList.size()]);

    // ////////////////treetable////////////////////////////

    treeTable.setRoot(root);
    Arrays.stream(rootKeys).forEach(
            rootKey -> root.getChildren().add(
                    createTreeItem(dc.getCombiFunc(), rootKey)));


    // ////////////////First column/////////////////////////

    TreeTableColumn<String, String> firstColumn = new TreeTableColumn<>("");
    treeTable.getColumns().add(firstColumn);// Tree column
    firstColumn.setPrefWidth(50);
    firstColumn
            .setCellValueFactory(new Callback<CellDataFeatures<String, String>, ObservableValue<String>>() {
                public ObservableValue<String> call(
                        CellDataFeatures<String, String> p) {
                    return new ReadOnlyStringWrapper(p.getValue()
                            .getValue());
                }
            });

    // //////////////////Rest Columns////////////////////////

    for (Entry<String, String> ent : dc.getSortedAssignedOrg().entrySet()) {

        TreeTableColumn<String, ArrayList<String>> col = new TreeTableColumn<>();
        Label label = new Label(ent.getValue());
        col.setGraphic(label);
        label.setTooltip(new Tooltip(label.getText()));// tooltip for column
                                                        // headers
        col.setPrefWidth(45);
        // cell Value Factory////////////////////////
        col.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<String, ArrayList<String>>, ObservableValue<ArrayList<String>>>() {
            @Override
            public ObservableValue<ArrayList<String>> call(
                    CellDataFeatures<String, ArrayList<String>> param) {
                TreeMap<String, List<String>> temp = (TreeMap<String, List<String>>) dc
                        .getFuncTypeOrg().clone();
                ArrayList<String> result = new ArrayList<>();
                for (int i = 0; i < dc.getFuncTypeOrg().size(); i++) {
                    List<String> list = temp.firstEntry().getValue();

                    String key = temp.firstEntry().getKey();

                    if (list.get(1).equals(param.getValue().getValue())
                            && !list.get(5).equals(label.getText())) {
                        result.add("white");
                    }
                    if (!root.isLeaf()) {

                        result.add("parent");
                    }
                    if (list.get(1).equals(param.getValue().getValue())
                            && list.get(5).equals(label.getText())) {
                        result.add(0, list.get(2));// weight

                        if (list.size() > 6) {
                            result.add(1, list.get(list.size() - 1));// color
                            result.add(2, list.get(6));// App component
                        }

                        else
                            // result.add("white");
                            result.add("noOrg");

                    } else
                        temp.remove(key);

                }

                return new ReadOnlyObjectWrapper<ArrayList<String>>(result);
            }
        }); // end cell Value Factory

        // //////////////cellfactory/////////////////////////
        col.setCellFactory(new Callback<TreeTableColumn<String, ArrayList<String>>, TreeTableCell<String, ArrayList<String>>>() {
            @Override
            public TreeTableCell<String, ArrayList<String>> call(
                    TreeTableColumn<String, ArrayList<String>> param) {
                return new TreeTableCell<String, ArrayList<String>>() {
                    public void updateItem(ArrayList<String> item,
                            boolean empty) {
                        super.updateItem(item, empty);

                        if (item == null || empty) {
                            setStyle("");
                            setText("");
                        } else if (item.contains("Green")) {
                            float weightInt = Float.parseFloat(item.get(0));
                            float res = weightInt * 1;
                            String resString = Float.toString(res);
                            this.setStyle("-fx-background-color:green");
                            setTooltip(new Tooltip(item.get(2)));
                            setText(resString);
                        } else if (item.contains("yellow")) {
                            this.setStyle("-fx-background-color:yellow");
                            setTooltip(new Tooltip(item.get(2)));
                            setText("0");
                        } else if (item.contains("white")) {
                            this.setStyle("-fx-background-color:linear-gradient(black, white); ");

                            // setText("DD");
                        } else if (item.contains("parent")) {
                            for (int i = 0; i < dc.getFuncTypeOrg().size(); i++) {

                            }

                            String text = param.getCellData(root).get(0);
                            // setText(text);
                        }
                    }
                };
            };

        });// end cell factory


        treeTable.getColumns().add(col);
    }//end for loop col

TreeMap 一時クローン dc.getFuncTypeOrg()。この TreeMap には、各子の値 (色と数) があります。次に、cellfactory で色の値を乗算します (緑 = 1 および黄色 = 0)。ループの外では、各親をキーとして、すべての子を値として含むツリーマップを作成することを考えました。次に、子の値を合計して、最初のキーが親で、値として必要な値 (または単に文字列 ArrayList ) であるツリーマップを作成できます。その後、cellFactory でセルの名前を確認できます。それが親である場合は、セルの値が適切です。treeitem の値を取得する方法を教えてもらったので、今ここにいます:

//after col loop ends
TreeMap<String, List<TreeItem<String>>> mytreemap = new TreeMap<>(); 
    TreeMap<String, List<String>> parChild = new TreeMap<>();

    for(TreeItem node: root.getChildren()){
        if(!node.isLeaf())
            mytreemap.put(node.getValue().toString(), node.getChildren());
        }

        for(Entry<String, List<TreeItem<String>>> ent: mytreemap.entrySet()){

            for(TreeItem myItem : ent.getValue()){
                // how can i fill parChild with parent as key and all its children as value?
                System.out.println(ent.getKey()+"  "+myItem.getValue());
            }
        }

    treeTable.setPrefWidth(1200);
    treeTable.setPrefHeight(500);
    treeTable.setShowRoot(false);
    treeTable.setTableMenuButtonVisible(true);
    return treeTable; }

ここで setCellFactory

     else if (item.contains("parent")) {
                            for (int i = 0; i < dc.getFuncTypeOrg().size(); i++) {

                            }

根が取れます。(そのルート セルの子と子の数まで) 再帰を実行し、それらの値を一緒に追加して、親セルをその値に setText する方法はありますか?

4

1 に答える 1

1

メソッドを使用onEditCommitして、すべての子の値を追加し、それらを親セルに表示できます。例えば

column1.setOnEditCommit((evt) -> {
            //finalsing value of the cell
            evt.getRowValue().getValue().setCellValue((evt.getNewValue()));
            //Returns all the sibblings of the current cell
            ObservableList<TreeItem> children = evt.getRowValue().getParent().getChildren();
            int parentValue = 0;
            for (TreeItem<> child : children) {
                parentValue = parentValue + Integer.valueOf(child.getValue().getCellValue());
            }
            evt.getRowValue().getParent().getValue().setCellValue(parentValue);
        });
于 2015-10-14T08:02:28.783 に答える