如何将 propertyvaluefactory 指向地图的值?

2024-02-29

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

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

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

编辑:添加了相关对象的代码。 所以基本上,我需要 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 and TableColumns.

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

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

如果您只想要行值,而不关心知道哪个TableView or TableColumn你在(或者已经知道,这很常见),你得到行值(Trainee在你的例子中)通过调用getValue() on the CellDataFeatures object.

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

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

在你的例子中,call()方法只需引用地图:

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)));

The PropertyValueFactory在许多示例中使用的只是一个预定义的实现,它使用反射来查找所提供的对象中返回可观察值的现有方法。它所做的事情的基本逻辑在Javadocs http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/cell/PropertyValueFactory.html。恕我直言,它在 Java 8 中相当多余,因为你可以替换

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

with

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 propertyvaluefactory 指向地图的值? 的相关文章

  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐