- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不要将 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;
}
最佳答案
我不会抑制“未经检查”的警告:没有理由不正确输入您的 TableView
和TableColumn
s。
setCellValueFactory(...)
TableColumn
中的方法不需要拿PropertyValueFactory
:它可以采取任何 Callback<CellDataFeatures<S>, ObservableValue<T>>
。这里S
是表格每行显示的数据类型(即您正在使用 TableView<S>
),而 T
是此列中显示的数据类型(即您正在使用 TableColumn<S,T>
)。在你的情况下S
是 Trainee
和T
是 Number
.
这个Callback
本质上只是一个将给定行值(在您的情况下为 Trainee)转换为要在单元格中显示的值的函数。它变得稍微复杂一些,因为行值包含在 CellDataFeatures
中。对象,返回类型必须为 ObservableValue
包装要显示的实际值。一个CellDataFeatures
如果您想要访问其他信息来计算您的值(它使您可以访问显示值的 TableColumn
和保存 TableView
的 TableColumn
)。安ObservableValue
需要返回为 TableCell
将观察值的变化并自动更新。
如果您只想要行值,而不关心知道哪个 TableView
或TableColumn
你在(或者已经知道,这很常见),你可以通过调用 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/
我是一名优秀的程序员,十分优秀!