JavaFX:从TableView

时间:2015-06-30 20:54:24

标签: javafx tableview

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

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

由于搜索到的数据的视图区域与我编写新数据的表单相同,我想我会重新使用这些字段。

但是,我将TableView作为其中一项,我不确定如何从表格中提取信息。

我假设由于TableView填充了一个自定义的Row类,我可以检索组成表的行集并以这种方式解构它们,但我无法确定如何最好地完成它。

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

1 个答案:

答案 0 :(得分:0)

您只需要在表上调用getItems()并遍历返回的列表。假设所有内容都以普通" JavaFX方式设置",列表元素中的任何属性都将由编辑机制自动更新。

这是一个完整的,基于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>

EditableTableController:

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

模型类Person

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

申请类:

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()方法,该方法遍历表格的项目列表并从每个项目中检索属性值。如果双击要编辑的单元格,键入以更改值,然后使用 Enter 提交编辑,然后按下按钮将显示更新的值。