gpt4 book ai didi

string - JavaFx - 如何在 TableView 中显示 SimpleStringProperty 值

转载 作者:行者123 更新时间:2023-12-04 23:05:25 24 4
gpt4 key购买 nike

我正在忙于完成教程,但被困在一个点上。

基本上启动新场景并在表 View 中显示 Person 类型的 ObservableList 中的值。

person 类由 3 个 SimpleStringProperty 的 fisName、lastName 和 email 组成。

但是当我运行应用程序时,它似乎在表中显示 SimpleStringProperty [StringProperty [value:actualvalue]] 的值,而不是 SimpleStringProperty 的值。如果我将 Person 的类 getFirstName 方法更改为返回 String firstName.get() 那么它会在表中正确显示该值。

我应该使用 SimpleStringProperty 还是像 String 这样的普通对象?
enter image description here

人类

package co.za.chrispie.addressBook;

import javafx.beans.property.SimpleStringProperty;

public class Person {

private SimpleStringProperty firstName;
private SimpleStringProperty lastName;
private SimpleStringProperty email;

public Person(final String firstName, final String lastName, final String email) {
this.firstName = new SimpleStringProperty(firstName);
this.lastName = new SimpleStringProperty(lastName);
this.email = new SimpleStringProperty(email);
}

public String getFirstName() {
return firstName.get(); //Changes this method to return a String
}

public SimpleStringProperty getLastName() {
return lastName;
}

public SimpleStringProperty getEmail() {
return email;
}

}

Controller 类
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package co.za.chrispie.addressBook;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;

public class OracleAddressBookController implements Initializable {

@FXML
TableView<Person> table;
@FXML
TableColumn<Person, String> colFirstName;
@FXML
TableColumn<Person, String> colLastName;
@FXML
TableColumn<Person, String> colEmail;

final ObservableList<Person> data = FXCollections.observableArrayList(
new Person("Jaco", "Pieters", "jp@me.co.za"),
new Person("Chrispie", "Pieters", "chrispie@me.co.za")
);

@Override
public void initialize(URL url, ResourceBundle rb) {
assert colFirstName != null : "fx:id=\"colFirstName\" was not injected: check your FXML file 'OracleAddressBook.fxml'.";
assert colLastName != null : "fx:id=\"colLastName\" was not injected: check your FXML file 'OracleAddressBook.fxml'.";
assert colEmail != null : "fx:id=\"colEmail\" was not injected: check your FXML file 'OracleAddressBook.fxml'.";
configureTable();
}

private void configureTable() {
colFirstName.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
colLastName.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
colEmail.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));

table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

table.setItems(data);
assert table.getItems() == data;
}
}

和前端 FXML
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="500.0" prefWidth="600.0" styleClass="mainFxmlClass" xmlns:fx="http://javafx.com/fxml" fx:controller="co.za.chrispie.addressBook.OracleAddressBookController">
<children>
<Label layoutX="14.0" layoutY="11.0" text="Address Book" />
<TableView fx:id="table" layoutX="14.0" layoutY="35.0" prefHeight="451.0" prefWidth="572.0">
<columns>
<TableColumn prefWidth="75.0" text="First Name" fx:id="colFirstName" />
<TableColumn prefWidth="75.0" text="Last Name" fx:id="colLastName" />
<TableColumn prefWidth="75.0" text="Email" fx:id="colEmail" />
</columns>
</TableView>
</children>
<stylesheets>
<URL value="@oracleaddressbook.css" />
</stylesheets>
</AnchorPane>

最佳答案

您需要将属性 getter 的名称更改为 nameProperty(),其中 name 是您的属性。所以你会有 firstNameProperty() 和 emailProperty()。
getName() 作品 ,但该表不会观察到属性的变化。
PropertyValueFactory 的文档解释了这个主题:

In this example, the "firstName" string is used as a reference to an assumed firstNameProperty() method in the Person class type (which is the class type of the TableView items list). Additionally, this method must return a Property instance. If a method meeting these requirements is found, then the TableCell is populated with this ObservableValue . In addition, the TableView will automatically add an observer to the returned value, such that any changes fired will be observed by the TableView, resulting in the cell immediately updating.

If no method matching this pattern exists, there is fall-through support for attempting to call get() or is() (that is, getFirstName() or isFirstName() in the example above). If a method matching this pattern exists, the value returned from this method is wrapped in a ReadOnlyObjectWrapper and returned to the TableCell. However, in this situation, this means that the TableCell will not be able to observe the ObservableValue for changes (as is the case in the first approach above).

关于string - JavaFx - 如何在 TableView 中显示 SimpleStringProperty 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13518239/

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