首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaFX我想用非基本数据类型填充我的表

JavaFX我想用非基本数据类型填充我的表
EN

Stack Overflow用户
提问于 2018-08-06 03:15:33
回答 1查看 179关注 0票数 -1

我有一个这样的类:

代码语言:javascript
复制
public class HourMinute {
    private int hour;
    private int minute;
...
}

像这样的类:

代码语言:javascript
复制
public class WorkTime {
    private HourMinute start;
    private HourMinute end;
    private HourMinute total;
    private LocalDate ld;
    private int ID;
...
}

我将WorkTime类型信息存储在数据库中。我应该如何将数据放在表视图中?

代码语言:javascript
复制
public void tableColumns() {
    TableColumn year = new TableColumn("Year");
    TableColumn month = new TableColumn("Month");
    TableColumn day = new TableColumn("Day");
    TableColumn startHour = new TableColumn("Start hour");
    TableColumn startMinute = new TableColumn("Start minute");
    TableColumn endHour = new TableColumn("End hour");
    TableColumn totalHour = new TableColumn("Total hour");
    TableColumn totalMinute = new TableColumn("Total minute");

    //table.getColumns().addAll(...);
    data.addAll(db.getAllWork());
    table.setItems(data);
}

正如您在上面看到的,WorkTime类包含HourMinute和LocalDate变量。我应该如何从这些类型中提取数据,使它们在我的表视图中“可显示”?

(附带问题:是否可以用字符串填充单元格?就像我可以只做一个数据列,看起来像YYYY-MM-DD (year+"-"+month+"-"+day))

EN

回答 1

Stack Overflow用户

发布于 2018-08-06 04:07:14

您需要更新数据对象模型,以表示希望在TableView中显示的数据。因此,在下面的代码中,我修改了您的WorkTime类,使其更适合显示。

因此,对于您的WorkTime类,我已经将每个字段更新为一个Property,以便TableView能够找到它。

我还对WorkTime类进行了一些重构。构造函数现在接受HourMinute对象,并在创建WorkTime对象时解析来自这些对象的数据。

代码语言:javascript
复制
public class WorkTime {

    // All fields should be converted to properties
    private IntegerProperty startHour = new SimpleIntegerProperty();
    private IntegerProperty startMinute = new SimpleIntegerProperty();
    private IntegerProperty endHour = new SimpleIntegerProperty();
    private IntegerProperty endMinute = new SimpleIntegerProperty();
    private IntegerProperty totalHours = new SimpleIntegerProperty();
    private IntegerProperty totalMinutes = new SimpleIntegerProperty();
    private ObjectProperty<LocalDate> localDate = new SimpleObjectProperty<>();

    public WorkTime(HourMinute start, HourMinute end, HourMinute total, LocalDate localDate) {
        // Accept the start and end times as HourMinute objects and extract each value from them.
        this.startHour.set(start.getHour());
        this.startMinute.set(start.getMinute());
        this.endHour.set(end.getHour());
        this.endMinute.set(end.getMinute());
        this.totalHours.set(total.getHour());
        this.totalMinutes.set(total.getMinute());
        this.localDate.set(localDate);
    }

    public int getStartHour() {
        return startHour.get();
    }

    public IntegerProperty startHourProperty() {
        return startHour;
    }

    public int getStartMinute() {
        return startMinute.get();
    }

    public IntegerProperty startMinuteProperty() {
        return startMinute;
    }

    public int getEndHour() {
        return endHour.get();
    }

    public IntegerProperty endHourProperty() {
        return endHour;
    }

    public int getEndMinute() {
        return endMinute.get();
    }

    public IntegerProperty endMinuteProperty() {
        return endMinute;
    }

    public int getTotalHours() {
        return totalHours.get();
    }

    public IntegerProperty totalHoursProperty() {
        return totalHours;
    }

    public int getTotalMinutes() {
        return totalMinutes.get();
    }

    public IntegerProperty totalMinutesProperty() {
        return totalMinutes;
    }

    public LocalDate getLocalDate() {
        return localDate.get();
    }

    public ObjectProperty<LocalDate> localDateProperty() {
        return localDate;
    }
}

现在,回到您的主类,您需要更新您的TableView定义来定义它将保存什么类型的数据。在本例中,它被设置为显示WorkTime对象的列表:

代码语言:javascript
复制
TableView<WorkTime> tableView = new TableView<>();

还需要更新TableColumn对象,以定义要显示的数据类型。这将需要两个参数:整体对象类型和单元格将包含的数据类型:

代码语言:javascript
复制
TableColumn<WorkTime, Integer> colStartHour = new TableColumn<>("Start Hour");
        TableColumn<WorkTime, String> colStartMinute = new TableColumn<>("Start Minute");
        TableColumn<WorkTime, Integer> colEndHour = new TableColumn<>("End Hour");
        TableColumn<WorkTime, String> colEndMinute = new TableColumn<>("End Minute");
        TableColumn<WorkTime, Integer> colTotalHours = new TableColumn<>("Total Hours");
        TableColumn<WorkTime, String> colTotalMinutes = new TableColumn<>("Total Minutes");

最后一步是为每一列定义CellValueProperty。在这里,您可以准确地告诉JavaFX 将在您的WorkTime类中的哪个位置找到数据:

代码语言:javascript
复制
colStartHour.setCellValueFactory(new PropertyValueFactory<>("startHour"));
        colStartMinute.setCellValueFactory(new PropertyValueFactory<>("startMinute"));
        colEndHour.setCellValueFactory(new PropertyValueFactory<>("endHour"));
        colEndMinute.setCellValueFactory(new PropertyValueFactory<>("endMinute"));
        colTotalHours.setCellValueFactory(new PropertyValueFactory<>("totalHours"));
        colTotalMinutes.setCellValueFactory(new PropertyValueFactory<>("totalMinutes"));

您将看到定义WorkTime中定义的属性名称的new PropertyValueFactory<>("propertyName")部分。JavaFX将获取该属性的值,并将其显示在单元格中。

所以这将适用于您需要的任何数据类型,只要您将列定义为期望该数据类型即可。

这就是所有的事情!这将允许您正确地显示数据。

下面的

是一个使用上面的WorkTime类的简单MCVE。

代码语言:javascript
复制
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableArray;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.time.LocalDate;
import java.util.List;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Create sample WorkTime objects. Store them in an ObservableArrayList so the TableView can display them
        ObservableList<WorkTime> workTimes = FXCollections.observableArrayList();
        workTimes.add(new WorkTime(
                new HourMinute(1, 2),
                new HourMinute(1, 2),
                new HourMinute(1, 2),
                LocalDate.now()));
        workTimes.add(new WorkTime(
                new HourMinute(1, 2),
                new HourMinute(1, 2),
                new HourMinute(1, 2),
                LocalDate.now()));
        workTimes.add(new WorkTime(
                new HourMinute(1, 2),
                new HourMinute(1, 2),
                new HourMinute(1, 2),
                LocalDate.now()));

        // Simple UI
        VBox root = new VBox(10);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.TOP_CENTER);

        // Create a TableView
        TableView<WorkTime> tableView = new TableView<>();

        // Create each column
        TableColumn<WorkTime, Integer> colStartHour = new TableColumn<>("Start Hour");
        TableColumn<WorkTime, String> colStartMinute = new TableColumn<>("Start Minute");
        TableColumn<WorkTime, Integer> colEndHour = new TableColumn<>("End Hour");
        TableColumn<WorkTime, String> colEndMinute = new TableColumn<>("End Minute");
        TableColumn<WorkTime, Integer> colTotalHours = new TableColumn<>("Total Hours");
        TableColumn<WorkTime, String> colTotalMinutes = new TableColumn<>("Total Minutes");

        // Set the CellValueFactory for each column to define what data to use for each column. This should match the
        // property set in the WorkTime class
        colStartHour.setCellValueFactory(new PropertyValueFactory<>("startHour"));
        colStartMinute.setCellValueFactory(new PropertyValueFactory<>("startMinute"));
        colEndHour.setCellValueFactory(new PropertyValueFactory<>("endHour"));
        colEndMinute.setCellValueFactory(new PropertyValueFactory<>("endMinute"));
        colTotalHours.setCellValueFactory(new PropertyValueFactory<>("totalHours"));
        colTotalMinutes.setCellValueFactory(new PropertyValueFactory<>("totalMinutes"));

        // Add the columns to the TableView
        tableView.getColumns().addAll(colStartHour, colStartMinute, colEndHour, colEndMinute, colTotalHours, colTotalMinutes);

        // Set the people list as the data for the TableView
        tableView.setItems(workTimes);

        // Add the TableView to the scene
        root.getChildren().add(tableView);

        // Finish building the stage and show it
        primaryStage.setTitle("TableView Sample");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();

    }
}

回答您的侧面问题

这也很容易做到。只需向您的WorkTime类添加另一个属性:

代码语言:javascript
复制
private StringProperty dateString = new SimpleStringProperty();

public String getDateString() {
    return year + "-" + month + "-" + date;
}

然后将该列添加到您的TableView并设置适当的CelLValueProperty

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51697499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档