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

在控件中显示属性的JavaFX

孙元明
2023-03-14

我正在自己学习Oracle的JavaFX教程。在做了很多年(很久以前)之后,我对Swing的新智能功能非常着迷,包括。属性。我惊讶地发现,这些示例(例如:https://docs.oracle.com/javafx/2/ui_controls/table-view.htm)并没有以我认为“正确”的方式使用它们。

该示例创建一个Person类,其属性为字段:

public static class Person {
    private final SimpleStringProperty firstName;
    ...

但是getter不是用于属性,而是用于它们的值

    public String getFirstName() {
        return firstName.get();
    }
    emailCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("firstName"));
    firstNameCol.setCellValueFactory( celldata -> 
        celldata.getValue().firstNameProperty());

共有1个答案

屈晨
2023-03-14

首先,请注意,如果您遵循预期的模式:

public class Person {

    private final StringProperty firstName = new SimpleStringProperty();

    public StringProperty firstNameProperty() {
        return firstName ;
    }

    public final String getFirstName() {
        return firstNameProperty().get();
    }

    public final void setFirstName(String firstName) {
        firstNameProperty().set(firstName);
    }
}

然后,您的任何一个版本的代码都将在不调用table.refresh()的情况下工作。这是PropertyValueFactory的预期用途,从文档中可以清楚地看出这一点。

但是,lambda表达式是比PropertyValueFactory更好的方法,这一点您是正确的。除了您引用的原因之外,使用lambda表达式还有其他主要优点,而不是PropertyValueFactory。首先,也是最重要的是,PropertyValueFactory只是将属性的名称作为字符串,这意味着没有对其进行编译时检查。因此,如果您拼错了属性的名称:

firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstname"));

这样编译就很好了,你只会在列中得到空白单元格。这可能很难调试(这个站点上请求帮助解决此类bug的问题的数量就证明了这一点:例如,Javafx PropertyValueFactory没有填充Tableview)。

firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> cellData) {
        return cellData.getValue().firstNameProperty();
    }
});
 类似资料:
  • 我用两个jsp文件和一个控制器构建了一个小servlet。 这是: 这是控制器: 当我在登录jsp页面上输入用户名和密码并点击提交时,这两个属性都显示在URL行中。 这就是我得到的: 我该怎么解决?

  • 问题内容: } “此POJO在JPA中将初始值为1001,在Hibernate中为1作为初始值”还有一个疑问,如何在此处使用注释设置增量步长在JPA中,当我使用增量策略时,它没有问题,但是增量问题 请帮助我,在此先感谢 问题答案: 我只是有同样的问题。它与hibernate的旧生成器和JPA不匹配。 您需要将此添加到您的配置中 请参阅hibernate文档:http : //docs.jboss.

  • 问题内容: 显示属性和可见性属性之间有何区别? 问题答案: 该属性仅告诉浏览器是否显示元素。它是可见的(-您可以看到)或不可见的(-您看不到)。 该属性告诉浏览器 如何 绘制和显示元素(如果有的话)-是将其显示为元素(即,与文本和其他内联元素一起流动)还是-level元素(即,具有height和width属性,你可以设置,它的浮动等),或(即它的作用就像一个黑匣子,但奠定了直列代替)和其他一些人(

  • 问题内容: 我目前正在设计CSS“巨型下拉菜单”-基本上是一个常规的仅CSS下拉菜单,但其中包含不同类型的内容。 目前, 似乎CSS 3过渡不适用于’display’属性 ,即,您不能进行从到(或任何组合)的任何过渡。 当有人将鼠标悬停在顶层菜单项之一上时,是否可以通过上述示例使第二层菜单“淡入”? 我知道您可以在属性上使用过渡,但我想不出一种有效使用过渡的方法。 我也尝试过使用高度,但是那不幸地

  • 本文向大家介绍C#实现ComboBox控件显示出多个数据源属性的方法,包括了C#实现ComboBox控件显示出多个数据源属性的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现ComboBox控件显示出多个数据源属性的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 如果属性和属性存在,thymeleaf中是否有一种简单的方法来显示属性属性的内容?如果我的html页面中有属性“error”和属性“summary”,我想显示它: 如果没有属性“error”,将引发以下错误: 目前,我正在使用以下方法,这似乎太复杂了。 有没有更简单的方法来实现这一点?