JavaFX:从 TableView 中提取数据

JavaFX: Extracting data from a TableView

我目前正在使用一个应用程序,该应用程序允许用户在给定文件中搜索他们可能要查找的数据,并且一切正常。

下一个实现是允许用户填充自己的数据并将其保存到单独的文件中。

由于搜索到的数据的视图区域与我制作用于写入新数据的表单的方式相同,我想我应该重新使用这些字段。

但是,我有一个 TableView 作为项目之一,我不确定您是如何从 table 中提取信息的。

我假设因为 TableView 填充了自定义行 class,所以我可以检索组成 table 的行集并以这种方式解构它们,但我无法确定如何最好地做到这一点。

同时,我正在尝试学习如何覆盖 TableView 的单元格工厂的元素以使单元格成为 editable(因为 editable 默认情况下不执行任何操作?) ,所以这可能是一个巩固战略的地方。

您只需在 table 上调用 getItems() 并遍历返回的列表。假设一切都在正常 "JavaFX way" 中设置,列表元素中的任何属性将由编辑机制自动更新。

这是一个完整的、基于 FXML 的示例。

EditableTableExample.fxml(在包 application 中):

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.cell.TextFieldTableCell?>
<?import javafx.scene.layout.HBox?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="application.EditableTableViewController">
    <center>
        <TableView fx:id="table" editable="true">
            <columns>
                <TableColumn text="First Name" prefWidth="150"
                    fx:id="firstNameColumn">
                    <cellFactory>
                        <TextFieldTableCell fx:factory="forTableColumn" />
                    </cellFactory>
                </TableColumn>
                <TableColumn text="Last Name" prefWidth="150" fx:id="lastNameColumn">
                    <cellFactory>
                        <TextFieldTableCell fx:factory="forTableColumn" />
                    </cellFactory>
                </TableColumn>
                <TableColumn text="Email" prefWidth="150" fx:id="emailColumn">
                    <cellFactory>
                        <TextFieldTableCell fx:factory="forTableColumn" />
                    </cellFactory>
                </TableColumn>
            </columns>
        </TableView>
    </center>
    <bottom>
        <HBox alignment="CENTER">
            <padding>
                <Insets top="10" right="10" left="10" bottom="10" />
            </padding>
            <children>
                <Button onAction="#showData" text="Show Data" />
            </children>
        </HBox>
    </bottom>
</BorderPane>

Editable表控制器:

package application;

import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;


public class EditableTableViewController {

    @FXML
    private TableView<Person> table ;

    @FXML
    private TableColumn<Person, String> firstNameColumn ;

    @FXML
    private TableColumn<Person, String> lastNameColumn ;

    @FXML
    private TableColumn<Person, String> emailColumn ;

    public void initialize() {
        firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
        lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty());
        emailColumn.setCellValueFactory(cellData -> cellData.getValue().emailProperty());

        table.getItems().addAll(
                new Person("Jacob", "Smith", "jacob.smith@example.com"),
                new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
                new Person("Ethan", "Williams", "ethan.williams@example.com"),
                new Person("Emma", "Jones", "emma.jones@example.com"),
                new Person("Michael", "Brown", "michael.brown@example.com")
        ) ;
    }

    @FXML
    private void showData() {
        for (Person person : table.getItems()) {
            String formatted = String.format("%s %s (%s)", person.getFirstName(), person.getLastName(), person.getEmail());
            System.out.println(formatted);
        }
        System.out.println();
    }
}

型号classPerson:

package application;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Person {
    private final StringProperty firstName = new SimpleStringProperty(this, "firstName");
    public final String getFirstName() {
        return firstNameProperty().get();
    }
    public final void setFirstName(String firstName) {
        firstNameProperty().set(firstName);
    }
    public StringProperty firstNameProperty() {
        return firstName ;
    }

    private final StringProperty lastName = new SimpleStringProperty(this, "lastName");
    public final String getLastName() {
        return lastNameProperty().get();
    }
    public final void setLastName(String lastName) {
        lastNameProperty().set(lastName);
    }
    public StringProperty lastNameProperty() {
        return lastName ;
    }

    private final StringProperty email = new SimpleStringProperty(this, "email");
    public final String getEmail() {
        return emailProperty().get();
    }
    public final void setEmail(String email) {
        emailProperty().set(email);
    }
    public StringProperty emailProperty() {
        return email ;
    }

    public Person(String firstName, String lastName, String email) {
        this.setFirstName(firstName);
        this.setLastName(lastName);
        this.setEmail(email);
    }
}

申请class:

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


public class EditableTableViewExample extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("EditableTableExample.fxml"));
        BorderPane root = loader.load();
        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);       
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

该按钮仅用于演示,但按下它会调用控制器中的 showData() 方法,该方法遍历 table 的项目列表并检索 属性每个值。如果您双击要编辑的单元格,键入以更改值,然后使用 Enter 提交编辑,然后按下按钮将显示更新后的值。