2015-03-18 1 views
0

У меня есть переменная, в которой я setText для ячейки, когда имя ее строки равно имени ее столбца. Он работает успешно, но, когда я разрушаю или расширяю treeitem или прокручиваю вниз, значение меняет свою ячейку. Как я могу преодолеть эту проблему? Должен ли я устанавливать setText для ячейки в методе updateItem?collapsing/expand treeitem меняет значения ячеек, в JavaFX

private TreeTableView<String> drawTable() { 

    root.setExpanded(true); 


    // ////////////////treetable//////////////////////////// 
    /** 
    * makes treeTable and set the nodes to it. 
    * */ 

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

    // ////////////////First column///////////////////////// 
    /** 
    * creates first column with no caption and sets treeview for that. 
    * */ 
    TreeTableColumn<String, String> firstColumn = new TreeTableColumn<>(""); 
    treeTable.getColumns().add(firstColumn);// Tree column 

    firstColumn.setEditable(false); 
    firstColumn.setSortable(false); 
    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//////////////////////// 
    /** 
    * go through all organizations which have a function and make column 
    */ 

    for (Entry<String, String> ent : dc.getSortedAssignedOrg().entrySet()) { 
     TreeTableColumn<String, ArrayList<String>> col = new TreeTableColumn<>(); 

     Label label = new Label(ent.getValue()); 
     col.setGraphic(label); 
     col.setEditable(false); 
     col.setSortable(false); 


      // //////////////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 (this.getTreeTableRow().getItem().equals(
            label.getText()) { 
            setText("yes"); 
           } 
          } 

         } 

        }; 
       }; 

      });// end cell factory 

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

    treeTable.setPrefWidth(1200); 
    treeTable.setPrefHeight(500); 
    treeTable.setShowRoot(false); 
    treeTable.setEditable(false); 

    treeTable.setTableMenuButtonVisible(true); 

    return treeTable; 
} 

//makes the tree hierarchy/// 
private TreeItem<String> createTreeItem(TreeMap<String, List<String>> data, 
     String rootKey) { 
    TreeItem<String> item = new TreeItem<>(); 
    item.setValue(rootKey); 
    item.setExpanded(true); 

    List<String> childData = data.get(rootKey); 
    if (childData != null) { 
     childData.stream().map(child -> createTreeItem(data, child)) 
       .collect(Collectors.toCollection(item::getChildren)); 
    } 

    String valueName = item.getValue(); 

    item.setValue((dc.getSortedfuncAll().get(valueName))); 

    return item; 
} 

} 
+1

Этот код действительно слишком трудно читать. Пожалуйста, создайте MCVE и обновите свой вопрос. OAS, те, кто глубоко вложен, и если выглядит так, что его можно было бы улучшить. – Warkst

+0

Я опустил некоторые условия, чтобы сделать его более понятным. Я заметил, что когда программа запускается, она отображается правильно, но как только я прокручиваю вниз, некоторые значения ячейки также меняются. – Iman

+0

Есть ли способ остановить таблицу от обновления значения? Этот третируемый объект не предназначен для редактирования. – Iman

ответ

0

Попробуйте использовать вместо setText следующее.

this.getTreeTableRow().setItem("yes"); 
+0

Он по-прежнему изменяет значения ячейки. – Iman