Skip to content

Commit e433487

Browse files
All cell factories completed and working. Comments needed.
1 parent 7670f09 commit e433487

File tree

8 files changed

+145
-18
lines changed

8 files changed

+145
-18
lines changed

src/main/kotlin/org/epistatic/app5/controller/ApplicationController.kt

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package org.epistatic.app5.controller
22

3+
import javafx.beans.property.ReadOnlyObjectWrapper
34
import javafx.collections.FXCollections
45
import javafx.collections.ObservableList
56
import javafx.fxml.FXML
67
import javafx.scene.control.Button
8+
import javafx.scene.control.TableCell
79
import javafx.scene.control.TableColumn
810
import javafx.scene.control.TableView
911
import javafx.scene.control.cell.PropertyValueFactory
@@ -12,6 +14,7 @@ import org.epistatic.app5.model.DateItem
1214
import java.time.OffsetDateTime
1315
import java.time.ZoneOffset
1416

17+
1518
/**
1619
* Licensed to the Apache Software Foundation (ASF) under one
1720
* or more contributor license agreements. See the NOTICE file
@@ -40,19 +43,42 @@ class ApplicationController {
4043
@FXML lateinit var dateView: TableView<DateItem>
4144
@FXML lateinit var labelColumn: TableColumn<DateItem, String>
4245
@FXML lateinit var dateStringColumn: TableColumn<DateItem, String>
43-
@FXML lateinit var date2Column: TableColumn<DateItem, OffsetDateTime>
44-
@FXML lateinit var date3Column: TableColumn<DateItem, OffsetDateTime>
45-
46+
@FXML lateinit var dateObjectColumn: TableColumn<DateItem, OffsetDateTime>
47+
@FXML lateinit var dateCustomColumn: TableColumn<DateItem, OffsetDateTime>
48+
@FXML lateinit var dateCustomColumn2: TableColumn<DateItem, OffsetDateTime>
49+
@FXML lateinit var dateLambdaColumn: TableColumn<DateItem, OffsetDateTime>
50+
4651
val model: ObservableList<DateItem> = FXCollections.observableArrayList<DateItem>()
4752

4853
@FXML
4954
fun initialize() {
5055
dateView.items = model
5156
labelColumn.cellValueFactory = PropertyValueFactory<DateItem, String>("label")
52-
dateStringColumn.cellValueFactory = PropertyValueFactory<DateItem, String>("date1")
53-
date2Column.cellValueFactory = PropertyValueFactory<DateItem, OffsetDateTime>("date2")
54-
date3Column.cellValueFactory = PropertyValueFactory<DateItem, OffsetDateTime>("date3")
5557

58+
// cannot do much with this - string limits choices
59+
dateStringColumn.cellValueFactory = PropertyValueFactory<DateItem, String>("date")
60+
61+
dateObjectColumn.cellValueFactory = PropertyValueFactory<DateItem, OffsetDateTime>("date")
62+
dateObjectColumn.cellFactory = DateCellFactory1()
63+
64+
dateCustomColumn.cellValueFactory = DateCellValueFactory()
65+
dateCustomColumn.cellFactory = DateCellFactory2()
66+
67+
// Offset date by 10 seconds
68+
dateCustomColumn2.cellValueFactory = DateOffsetCellValueFactory(10)
69+
dateCustomColumn2.cellFactory = DateCellFactory2()
70+
71+
// Use Lambda Cell Factory
72+
dateLambdaColumn.setCellValueFactory { cell: TableColumn.CellDataFeatures<DateItem, OffsetDateTime> -> ReadOnlyObjectWrapper(cell.value.date) }
73+
dateLambdaColumn.setCellFactory {
74+
object : TableCell<DateItem, OffsetDateTime>() {
75+
public override fun updateItem(dt: OffsetDateTime?, empty: Boolean) {
76+
super.updateItem(dt, empty)
77+
if (!empty)
78+
this.text = "Lambda - $dt"
79+
}
80+
}
81+
}
5682
addItems()
5783
}
5884

@@ -66,13 +92,13 @@ class ApplicationController {
6692
* Add items to table
6793
*/
6894
private fun addItems() {
69-
var item = DateItem("Green Tree", createDate(2018, 2, 3), createDate(2018, 4, 12), createDate(2018, 8, 21))
95+
var item = DateItem("Green Tree", createDate(2018, 2, 3))
7096
model.add(item)
71-
item = DateItem("Red Car", createDate(2017, 5, 19), createDate(2017, 3, 15), createDate(2017, 12, 21))
97+
item = DateItem("Red Car", createDate(2017, 5, 19))
7298
model.add(item)
73-
item = DateItem("Blue Ship", createDate(2016, 12, 19), createDate(2016, 6, 2), createDate(2017, 7, 28))
99+
item = DateItem("Blue Ship", createDate(2016, 12, 19))
74100
model.add(item)
75-
item = DateItem("Yellow Moon", createDate(1990, 4, 4), createDate(1990, 1, 2), createDate(1990, 3, 11))
101+
item = DateItem("Yellow Moon", createDate(1990, 4, 4))
76102
model.add(item)
77103
}
78104

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.epistatic.app5.controller
2+
3+
import javafx.scene.control.TableCell
4+
import javafx.scene.control.TableColumn
5+
import javafx.util.Callback
6+
import org.epistatic.app5.model.DateItem
7+
import java.time.OffsetDateTime
8+
import java.time.format.DateTimeFormatter
9+
10+
class DateCellFactory1 : Callback<TableColumn<DateItem, OffsetDateTime>, TableCell<DateItem, OffsetDateTime>> {
11+
12+
companion object {
13+
private val customFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd => HH:mm:ss")
14+
}
15+
16+
override fun call(col: TableColumn<DateItem, OffsetDateTime>?): TableCell<DateItem, OffsetDateTime> {
17+
return object : TableCell<DateItem, OffsetDateTime>() {
18+
public override fun updateItem(dt: OffsetDateTime?, empty: Boolean) {
19+
super.updateItem(dt, empty)
20+
if (!empty)
21+
this.text = customFormat.format(dt)
22+
}
23+
}
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.epistatic.app5.controller
2+
3+
import javafx.scene.control.TableCell
4+
import javafx.scene.control.TableColumn
5+
import javafx.util.Callback
6+
import org.epistatic.app5.model.DateItem
7+
import java.time.OffsetDateTime
8+
import java.time.format.DateTimeFormatter
9+
10+
class DateCellFactory2 : Callback<TableColumn<DateItem, OffsetDateTime>, TableCell<DateItem, OffsetDateTime>> {
11+
12+
companion object {
13+
private val customFormat = DateTimeFormatter.ofPattern("yy-MMM-dd *** HH:mm:ss")
14+
}
15+
16+
override fun call(col: TableColumn<DateItem, OffsetDateTime>?): TableCell<DateItem, OffsetDateTime> {
17+
return object : TableCell<DateItem, OffsetDateTime>() {
18+
public override fun updateItem(dt: OffsetDateTime?, empty: Boolean) {
19+
super.updateItem(dt, empty)
20+
if (!empty)
21+
this.text = customFormat.format(dt).replace(".", "") // hack - remove unexpected period in month names
22+
}
23+
}
24+
}
25+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.epistatic.app5.controller
2+
3+
import javafx.beans.property.ReadOnlyObjectWrapper
4+
import javafx.beans.value.ObservableValue
5+
import javafx.scene.control.TableColumn
6+
import javafx.util.Callback
7+
import org.epistatic.app5.model.DateItem
8+
import java.time.OffsetDateTime
9+
10+
class DateCellValueFactory : Callback<TableColumn.CellDataFeatures<DateItem, OffsetDateTime>, ObservableValue<OffsetDateTime>> {
11+
12+
override fun call(p: TableColumn.CellDataFeatures<DateItem, OffsetDateTime>): ObservableValue<OffsetDateTime> {
13+
return if (p.value != null) {
14+
ReadOnlyObjectWrapper(p.value.date)
15+
} else {
16+
// only objects have a modified attribute as far as I know now
17+
ReadOnlyObjectWrapper()
18+
}
19+
}
20+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.epistatic.app5.controller
2+
3+
import javafx.beans.property.ReadOnlyObjectWrapper
4+
import javafx.beans.value.ObservableValue
5+
import javafx.scene.control.TableColumn
6+
import javafx.util.Callback
7+
import org.epistatic.app5.model.DateItem
8+
import java.time.OffsetDateTime
9+
import java.time.ZoneOffset
10+
11+
/**
12+
* A Cell Value Factory which uses stateful data to alter the cell value
13+
*/
14+
class DateOffsetCellValueFactory(private val offsetSeconds: Long) : Callback<TableColumn.CellDataFeatures<DateItem, OffsetDateTime>, ObservableValue<OffsetDateTime>> {
15+
16+
override fun call(p: TableColumn.CellDataFeatures<DateItem, OffsetDateTime>): ObservableValue<OffsetDateTime> {
17+
return if (p.value != null) {
18+
ReadOnlyObjectWrapper(p.value.date.plusSeconds(offsetSeconds))
19+
} else {
20+
// only objects have a modified attribute as far as I know now
21+
ReadOnlyObjectWrapper()
22+
}
23+
}
24+
}

src/main/kotlin/org/epistatic/app5/model/DateItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ package org.epistatic.app5.model
22

33
import java.time.OffsetDateTime
44

5-
data class DateItem(val label:String, val date1:OffsetDateTime, val date2:OffsetDateTime, val date3:OffsetDateTime)
5+
data class DateItem(val label:String, val date:OffsetDateTime)

src/main/resources/app5/app5.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.date-column{
2+
-fx-font-size: 10px;
3+
-fx-font-family: Monaco;
4+
-fx-alignment: center;
5+
}

src/main/resources/app5/app5.fxml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<?import javafx.scene.layout.GridPane?>
1010
<?import javafx.scene.layout.RowConstraints?>
1111

12-
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.epistatic.app5.controller.ApplicationController">
12+
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="50" minWidth="150" prefHeight="200.0" prefWidth="800.0" stylesheets="@app5.css" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.epistatic.app5.controller.ApplicationController">
1313
<columnConstraints>
1414
<ColumnConstraints halignment="CENTER" hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="100.0" />
1515
</columnConstraints>
@@ -23,14 +23,16 @@
2323
<Insets bottom="8.0" right="10.0" />
2424
</GridPane.margin>
2525
</Button>
26-
<AnchorPane prefHeight="200.0" prefWidth="200.0">
26+
<AnchorPane prefHeight="200.0">
2727
<children>
28-
<TableView fx:id="dateView" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
28+
<TableView fx:id="dateView" prefHeight="200.0" prefWidth="750.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
2929
<columns>
30-
<TableColumn fx:id="labelColumn" prefWidth="75.0" text="Label" />
31-
<TableColumn fx:id="dateStringColumn" prefWidth="75.0" text="Date1" />
32-
<TableColumn fx:id="date2Column" prefWidth="75.0" text="Date2" />
33-
<TableColumn fx:id="date3Column" prefWidth="75.0" text="Date3" />
30+
<TableColumn fx:id="labelColumn" prefWidth="55.0" styleClass="date-column" text="Label" />
31+
<TableColumn fx:id="dateStringColumn" prefWidth="60.0" styleClass="date-column" text="dateStringColumn" />
32+
<TableColumn fx:id="dateObjectColumn" prefWidth="60.0" styleClass="date-column" text="dateObjectColumn" />
33+
<TableColumn fx:id="dateCustomColumn" prefWidth="90.0" styleClass="date-column" text="dateCustomColumn" />
34+
<TableColumn fx:id="dateCustomColumn2" prefWidth="90.0" styleClass="date-column" text="dateCustomColumn2" />
35+
<TableColumn fx:id="dateLambdaColumn" prefWidth="90.0" styleClass="date-column" text="dateLambdaColumn" />
3436
</columns>
3537
<columnResizePolicy>
3638
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />

0 commit comments

Comments
 (0)