gpt4 book ai didi

java - 如何将 propertyvaluefactory 指向 map 的值?

转载 作者:行者123 更新时间:2023-12-02 05:34:03 25 4
gpt4 key购买 nike

不要将 propertyvaluefactory 指向对象的属性,如下所示:

traineeCol.setCellValueFactory(new PropertyValueFactory("sumName"));

我需要它指向 map 内的属性,而 map 又是它在上面的代码中已经指向的对象的属性。这可能吗?

编辑:添加了相关对象的代码。所以基本上,我需要 PropertyValueFactory 指向具有给定键的整数,该键是列标题。

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package models;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import database.DAO;
import java.util.Map;

/**
*
* @author Jasper
*/
public class Trainee {
private final StringProperty firstName;
private final StringProperty tussenVoegsel;
private final StringProperty lastName;
private final StringProperty branch;
private final StringProperty sumName;
private final Map<String, Integer> trainingPassed;

public Trainee(String firstName, String tussenVoegsel, String lastName, String branch)
{
this.firstName = new SimpleStringProperty(firstName);
this.tussenVoegsel = new SimpleStringProperty(tussenVoegsel);
this.lastName = new SimpleStringProperty(lastName);
this.branch = new SimpleStringProperty(branch);
trainingPassed = new DAO().loadTrainingPassed(lastName);

this.sumName = new SimpleStringProperty(this.firstName.get() + " " +
this.tussenVoegsel.get() + " " + this.lastName.get());
}

public String getFirstName() {
return firstName.get();
}

public String getTussenVoegsel() {
return tussenVoegsel.get();
}

public String getLastName() {
return lastName.get();
}

public String getBranch() {
return branch.get();
}

public String getSumName() {
return sumName.get();
}

public Map<String, Integer> getTrainingPassed() {
return trainingPassed;
}

}

Edit2:添加了tableview的代码区域,包括声明等

@SuppressWarnings("unchecked")
private TableView table() {
TableView tableCourseCategories = new TableView();
ArrayList<TableColumn> colList = new ArrayList<>();

TableColumn traineeCol = new TableColumn("Training");
traineeCol.setMinWidth(130);
traineeCol.setCellValueFactory(new PropertyValueFactory("sumName"));

for (Course course : courses) {
if (course.getCategory().equals(this.category)) {
TableColumn<Trainee, Number> tc = new TableColumn<>();
tc.setEditable(true);
tc.setMinWidth(130);
tc.setText(course.getName());

// tc.setCellValueFactory(new Callback<CellDataFeatures<Trainee>>, ObservableValue<Number>>() {
// @Override
// public ObservableValue<Number> call(CellDataFeatures<Trainee> data) {
// Integer value = data.getValue().getTrainingPassed().get("sumName");
// return new ReadOnlyIntegerWrapper(value);
// }
// });

colList.add(tc);
}
}

tableCourseCategories.getItems().addAll(this.trainees);
tableCourseCategories.getColumns().add(traineeCol);
tableCourseCategories.getColumns().addAll(colList);

return tableCourseCategories;
}

最佳答案

我不会抑制“未经检查”的警告:没有理由不正确输入您的 TableViewTableColumn s。

setCellValueFactory(...) TableColumn中的方法不需要拿PropertyValueFactory :它可以采取任何 Callback<CellDataFeatures<S>, ObservableValue<T>> 。这里S是表格每行显示的数据类型(即您正在使用 TableView<S> ),而 T是此列中显示的数据类型(即您正在使用 TableColumn<S,T> )。在你的情况下STraineeTNumber .

这个Callback本质上只是一个将给定行值(在您的情况下为 Trainee)转换为要在单元格中显示的值的函数。它变得稍微复杂一些,因为行值包含在 CellDataFeatures 中。对象,返回类型必须为 ObservableValue包装要显示的实际值。一个CellDataFeatures如果您想要访问其他信息来计算您的值(它使您可以访问显示值的 TableColumn 和保存 TableViewTableColumn)。安ObservableValue需要返回为 TableCell将观察值的变化并自动更新。

如果您只想要行值,而不关心知道哪个 TableViewTableColumn你在(或者已经知道,这很常见),你可以通过调用 Trainee 来获取行值(示例中的 getValue() )关于CellDataFeatures对象。

如果您没有ObservableValue (例如 Property )对于您的值,您可以将常规值包装在 ReadOnlyXXXWrapper 之一中类。

所以基本上你需要的是 Callback实现其call(...)方法根据行的值计算要显示的值。

在您的示例中,call()方法只需引用 map 即可:

traineeCol.setCellValueFactory(new Callback<CellDataFeatures<Trainee>, ObservableValue<Number>>() {
@Override
public ObservableValue<Number> call(CellDataFeatures<Trainee> data) {
Integer value = data.getValue().getTrainingPassed().get(course.getName());
if (value == null) {
value = 0 ;
}
return new ReadOnlyIntegerWrapper(value);
}
});

在 Java 8 中,这减少为

traineeCol.setCellValueFactory(data -> 
new ReadOnlyIntegerWrapper(data.getValue().getTrainingPassed().getOrDefault(course.getName(),0)));

PropertyValueFactory在许多示例中使用的只是一个预定义的实现,它使用反射来查找所提供的对象中返回可观察值的现有方法。 Javadocs 中概述了它的基本逻辑。 。恕我直言,它在 Java 8 中相当多余,因为你可以替换

firstNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));

firstNameColumn.setCellValueFactory(data -> data.getValue().firstNameProperty());

后者不太容易出错(一切都经过编译器检查:方法返回的类型以及存在这种方法的事实)并且执行速度更快(反射通常相当慢)。

关于java - 如何将 propertyvaluefactory 指向 map 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com