当前位置: 首页 > 知识库问答 >
问题:

在TreeTableView中添加progressbar(将双倍值返回到Observable)

爱亮
2023-03-14

我正在试验JavaFX,并试图在树表中添加一个进度条。是否有办法将薪资值与进度条联系起来。

我的代码是Oracle的TreeTableView示例的修改版本:

public class TreeTableViewSample extends Application implements Runnable {

List<Employee> employees = Arrays.<Employee>asList(
        new Employee("Ethan Williams", 30.0),
        new Employee("Emma Jones", 10.0),
        new Employee("Michael Brown", 70.0),
        new Employee("Anna Black", 50.0),
        new Employee("Rodger York", 20.0),
        new Employee("Susan Collins", 70.0));

/*  private final ImageView depIcon = new ImageView (
 new Image(getClass().getResourceAsStream("department.png"))
 );
 */
final CheckBoxTreeItem<Employee> root
        = new CheckBoxTreeItem<>(new Employee("Sales Department", 0.0));
final CheckBoxTreeItem<Employee> root2
        = new CheckBoxTreeItem<>(new Employee("Departments", 0.0));

public static void main(String[] args) {
    Application.launch(TreeTableViewSample.class, args);
}

@Override
public void start(Stage stage) {
    root.setExpanded(true);
    employees.stream().forEach((employee) -> {
        CheckBoxTreeItem<Employee> cbt=new CheckBoxTreeItem<>(employee);
        cbt.selectedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
                if (newValue) {
                    System.out.println("Slected employ name is "+cbt.getValue().getName()); 
                }
            });

        root.getChildren().add(cbt);
    });
    stage.setTitle("Tree Table View Sample");
    final Scene scene = new Scene(new Group(), 400, 400);
    scene.setFill(Color.LIGHTGRAY);
    Group sceneRoot = (Group) scene.getRoot();

    TreeTableColumn<Employee, String> empColumn
            = new TreeTableColumn<>("Employee");
    empColumn.setPrefWidth(150);
    empColumn.setCellValueFactory(
            (TreeTableColumn.CellDataFeatures<Employee, String> param)
            -> new ReadOnlyStringWrapper(param.getValue().getValue().getName())
    );

    TreeTableColumn<Employee, Double> salaryColumn
            = new TreeTableColumn<>("Salary");
    salaryColumn.setPrefWidth(190);
    salaryColumn.setCellValueFactory(new Callback<CellDataFeatures<Employee, Double>, ObservableValue<Double>>() {
  @Override
  public ObservableValue<Double> call(CellDataFeatures<Employee, Double> p)          {
// p.getValue() returns the Employee instance for a particular TableView row
      return p.getValue().getValue().getSalary();
 }
 });
    salaryColumn.setCellFactory(ProgressBarTreeTableCell.<Employee>forTreeTableColumn());
    root2.getChildren().add(root);

    TreeTableView<Employee> treeTableView = new TreeTableView<>(root2);
    treeTableView.getColumns().setAll(empColumn, salaryColumn);
    treeTableView.setRowFactory(f -> new CheckBoxTreeTableRowHack<>());
    sceneRoot.getChildren().add(treeTableView);
    stage.setScene(scene);
    stage.show();
    ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
    executorService.scheduleAtFixedRate(this, 3, 10, TimeUnit.SECONDS);

}

@Override
public void run() {
    root2.getValue().setSalary(calcSalary(root));
}

public double calcSalary(TreeItem<Employee> t) {
    Double salary = 0.0;
    if (!t.isLeaf()) {

        ObservableList<TreeItem<Employee>> al = t.getChildren();
        for (int i = 0; i < al.size(); i++) {
            TreeItem<Employee> get = al.get(i);
            salary += calcSalary(get);
        }
        t.getValue().setSalary(salary);
    }
    return salary += t.getValue().getSalary();
}

public class Employee {

    private SimpleStringProperty name;
    private SimpleDoubleProperty salary;

    public SimpleStringProperty nameProperty() {
        if (name == null) {
            name = new SimpleStringProperty(this, "name");
        }
        return name;
    }

    public SimpleDoubleProperty salaryProperty() {
        if (salary == null) {
            salary = new SimpleDoubleProperty(this, "salary");
        }
        return salary;
    }

    private Employee(String name, Double salary) {
        this.name = new SimpleStringProperty(name);
        this.salary = new SimpleDoubleProperty(salary);
    }

    public String getName() {
        return name.get();
    }

    public void setName(String fName) {
        name.set(fName);
    }

    public Double getSalary() {
        return salary.get();
    }

    public void setSalary(Double fName) {
        salary.set(fName);
    }
}
}

我收到错误在返回p.get值(). getValue(). getSalary();它说不兼容类型:双不能转换为可观察值

到目前为止,我已经尝试返回新的ReadOnlyDoubleWrapper(p.getValue())。getValue()。getSalary()) 但这对我来说也不管用。

我正在使用JavaFx 8。

我正在尝试创建工资条,它也可以用作任务及其子任务的进度条。(只是在玩UI)。但不知道如何将它们与就业的真实值联系起来,因为我猜正常的表视图与树表视图不同。谢谢!:)


共有1个答案

鲁文昌
2023-03-14

这与TableView中的JavaFX属性基本相同:salaryProperty不是观察值

您需要将列设为TreeTableCol列

TreeTableColumn<Employee, Number> salaryColumn
        = new TreeTableColumn<>("Salary");
salaryColumn.setCellValueFactory(p -> p.getValue().getValue().salaryProperty());

另一个选项是使用salaryProperty()。asObject()返回一个ObjectProperty

TreeTableColumn<Employee, Double> salaryColumn
        = new TreeTableColumn<>("Salary");
salaryColumn.setCellValueFactory(p -> 
    p.getValue().getValue().salaryProperty().asObject());

 类似资料:
  • 问题内容: 假设我在TreeTableView中有2列,现在我想在第一列中添加一个字符串/标签,在另一列中添加一个ProgressBar。我将如何完成这样的事情? 非常感谢任何帮助! 问题答案: 正如James_D正确指出的,您可以将其用于带有ProgressBars的列。有内部支撑为如某些其他用户界面控件,等 对于其他UI控件,您可以创建一个Custom ,如下所示: 然后将a分配给第二列 在其

  • 正如文档https://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/中所述,我试图将设置为自动增量,这几乎可以正常工作,但是当试图插入记录时,函数返回的值是,而不是,因此我尝试了以下更改。

  • 和我的框架XML 有什么想法吗?我试图将progressBar放在WebView的“前面”,但是当页面被加载时,图标并没有消失...

  • 问题内容: 这是一个例子: 这将返回0,而不是应有的0.33333…。 有人知道吗? 问题答案: 这是因为和会被视为您没有另外指定时的处理方式,因此先评估, 然后将转换为。要解决此问题,请尝试,或者明确声明您正在处理double值。

  • 在java中,我试图添加一对相加到一定数量的数组,我尝试的方法之一是在HashMap中创建一个双ArrayList。如果我在列表中添加1和2,我将得到3作为键。例如: 输出如下所示 如果我再加一对 但是我一直得到一个'方法不适用于HashMap类型 我也试过了 我想我可能需要先初始化更大的矩阵,但遗憾的是,我最终还是出现了同样的错误。

  • 我正在转换一个建在Wordpress上的大型网站来回应,我的问题是: 在ComponentDidMount上,我将调用一个API并获得一长串ID列表,这些ID将添加到我的状态中。ID对应于需要动态呈现的人员。 所以现在我将状态设置为ID数组,我将对其进行映射以返回一些JSX, 即arrayids.map(id=>{return img src={async value====img URL ret