2016-03-30 15 views
0

我一直在使用Javafx中的表视图,并且我想动态地控制单击按钮上的单元格,这本身就是表视图的一部分。我试图自己做,但它不应该如此。所以需要帮助,因为他们无法做到。JavaFX:Tableview中按钮点击动态单元格控件?

按钮的TableCell代码:

dlColumn.setCellValueFactory(new PropertyValueFactory<>("")); 
dlColumn.setCellFactory(new Callback<TableColumn<SharedFileInfo, String>, TableCell<SharedFileInfo, String>>() { 

     @Override 
     public TableCell<SharedFileInfo, String> call(TableColumn<SharedFileInfo, String> param) { 

      final TableCell<SharedFileInfo, String> cell; 
      cell = new TableCell<SharedFileInfo, String>() { 
       final Button downloadButton = new Button(); 

       @Override 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setGraphic(null); 
         setText(null); 
        } else { 
         downloadButton.setOnAction((ActionEvent ae) -> { 
          progressColumn.setCellValueFactory(new PropertyValueFactory<>("progress")); 
          progressColumn.setCellFactory(new Callback<TableColumn<SharedFileInfo, Double>, TableCell<SharedFileInfo, Double>>() { 

         @Override 
         public TableCell<SharedFileInfo, Double> call(TableColumn<SharedFileInfo, Double> param) { 

         final ProgressBar progressBar = new ProgressBar(); 

         final TableCell<SharedFileInfo, Double> cell; 
         cell = new TableCell<SharedFileInfo, Double>() { 

           @Override 
           protected void updateItem(Double item, boolean empty) { 
           super.updateItem(item, true); 
           if (empty) { 
           setGraphic(null); 
           setText(null); 
           } else { 
            SharedFileInfo sharedinfo = getTableView().getItems().get(this.getIndex()); 
            progressBar.progressProperty().bind(sharedinfo.getProgress()); 

            setGraphic(progressBar); 
            progressBar.prefWidthProperty().bind(this.widthProperty()); 
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
            } 
           } 

          }; 
          return cell; 
         } 
        }); 
         }); 
         setGraphic(downloadButton); 
         setText(null); 
        } 
       } 
      }; 
      return cell; 
     } 
    }); 


前点击按钮,一切似乎都按预期运行,但是当我按一下按钮,整个progress柱得到填补空Progress Bars这就是我不不想。我希望每当用户点击按钮时,只有该行显示Progress Bar,并将所有其余设置设置为setGraphic(null);。请在这件事上给予我帮助。!
enter image description here> enter image description here

回答

1

目前我无法访问我的IDE,所以我会尝试写一些纯文本。

单击(任意)下载按钮,即可为整个列指定一个新的CellFactory,它不区分您想要“进步”的行和所有其他行。 所有记录都引用其progressProperty,但只有您单击的SharedFileInfo-Row的progressProperty正在更改。

如果你想继续做这样的添加在每ButtonClick一个CellFactory,
(我不会建议,因为你也可以设置一次,实现例如触发BooleanProperty) 你可以检查如果点击按钮行的SharedFileInfo实例是==的SharedFileInfo,比如在你的内心CellFactory

提示:Javafx, get the object referenced by a TableCell

编辑: 一个例子如何达到你的目标会这样工作的:

  1. 创建一个全局SharedFileInfo场
  2. 之初
  3. 扣柱,工厂设置CellFactories:开扣点击设置全球领域的= clickedCells SharedFileInfo实例
  4. 进展 - 柱 - 工厂:每个单元格都会检查其SharedFileInfo实例是否为您的全局字段的值,如果是,则显示其进度条

请注意,您可能必须“告诉”您的单元格以更新其外观在设置全局字段的值之后。我建议使用全球Property + ChangeListener。

+0

发帖后我无法检查我的问题,所以我想到了其他一些方式可以为我完成所需的任务,并且它基于您的想法。我没有在这里显示整个表格,但可以理解的是,还会有一个Name列,它在任何情况下都会变成静态的(创建一次,同时呈现)。所以我明确地为它提供Cell Factory,并且每当Name单元格被渲染时设置'setProgress(2);'。因此,我可以使用progress属性的这种行为来交叉检查Progress-Cell-Factory,当它是== 2,'setGraphic(null)',否则'setGraphic(progressBar)'。 – androizer

+0

我会等待一天,让其他用户给出答案,如果可以有任何其他方式,否则我会将你的答案标记为最终答案。 – androizer

相关问题