我有一个这样的类:
public class HourMinute {
private int hour;
private int minute;
...
}
像这样的类:
public class WorkTime {
private HourMinute start;
private HourMinute end;
private HourMinute total;
private LocalDate ld;
private int ID;
...
}
我将WorkTime类型信息存储在数据库中。我应该如何将数据放在表视图中?
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))
发布于 2018-08-06 04:07:14
您需要更新数据对象模型,以表示希望在TableView中显示的数据。因此,在下面的代码中,我修改了您的WorkTime
类,使其更适合显示。
因此,对于您的WorkTime
类,我已经将每个字段更新为一个Property
,以便TableView
能够找到它。
我还对WorkTime
类进行了一些重构。构造函数现在接受HourMinute
对象,并在创建WorkTime
对象时解析来自这些对象的数据。
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
对象的列表:
TableView<WorkTime> tableView = new TableView<>();
还需要更新TableColumn
对象,以定义要显示的数据类型。这将需要两个参数:整体对象类型和单元格将包含的数据类型:
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
类中的哪个位置找到数据:
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。
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
类添加另一个属性:
private StringProperty dateString = new SimpleStringProperty();
public String getDateString() {
return year + "-" + month + "-" + date;
}
然后将该列添加到您的TableView
并设置适当的CelLValueProperty
。
https://stackoverflow.com/questions/51697499
复制相似问题