Bonjour,
J'ai utilise le code du tutorial de JavaFX TableView Oracle qui n'utilise pas de styles. J'ai mixe avec le tutorial API Cell de Fabrice Bouyé (tutorial très pratique d'ailleurs) pour apporter du style a la table. Mon but étant de colorier en vert avec du texte rouge les lignes dont le prénom commence par "E".
Le code ci-dessous fonctionne bien mais j'ai une question :
1) Est ce la manière (la pseudo class) la plus simple de procéder sachant que je veux que le style fonctionne après tri sur la colonne first name?
Maintenant j'aimerais bien rajouter une colonne timestamp (qui par exemple serait égal a l'heure de modification d'une ligne) avec un SimpleLongProperty. Seulement je comprends que je vais recevoir un update que lorsque ma valeur va changer. J'aimerais toutefois pouvoir colorier la ligne suivant l'ancienneté de ce timestamp. Par example si le timestamp est > 5 min, alors la ligne se mettrait en bleue. (meme si la valeur est inchangée...)
Ma seconde question est la suivante :
2) Pouvez vous m'orientez si je dois gérer la logique en amont de la TableView par une property ou un listener ou bien il y aurait d'autres façon comme par example avoir un timer qui rafraichirait la table périodiquement et se rendrait compte que le style a besoin de changer meme si les valeurs n'ont pas changé. Avec Swing je n'avais pas ce problème car toute la table était rafraîchit. Or la je cherche a rafraichir une ligne qui par definition ne reçoit rien.
Merci
RowFactory
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 package application; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.VBox; import javafx.scene.text.Font; import javafx.stage.Stage; public class Main extends Application { private TableView<Person> table = new TableView<Person>(); private final ObservableList<Person> data = FXCollections.observableArrayList(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")); public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Scene scene = new Scene(new Group()); stage.setTitle("Table View Sample"); stage.setWidth(450); stage.setHeight(500); final Label label = new Label("Address Book"); label.setFont(new Font("Arial", 20)); table.setEditable(true); table.setRowFactory((final TableView<Person> p) -> new TableRender()); TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name"); firstNameCol.setMinWidth(100); firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName")); TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name"); lastNameCol.setMinWidth(100); lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName")); TableColumn<Person, String> emailCol = new TableColumn<>("Email"); emailCol.setMinWidth(200); emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email")); table.setItems(data); table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); final VBox vbox = new VBox(); vbox.setSpacing(5); vbox.setPadding(new Insets(10, 0, 0, 10)); vbox.getChildren().addAll(label, table); ((Group) scene.getRoot()).getChildren().addAll(vbox); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); stage.setScene(scene); stage.show(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 package application; import java.util.Optional; import javafx.animation.PauseTransition; import javafx.css.PseudoClass; import javafx.event.ActionEvent; import javafx.scene.control.TableRow; import javafx.util.Duration; public class TableRender extends TableRow<Person> { private PauseTransition styleWaitTimer; private final Duration styleWaitDuration = Duration.millis(350); private Optional<Person> value = Optional.empty(); @Override protected void updateItem(Person p, boolean b) { super.updateItem(p, b); value = Optional.ofNullable(p); requestUpdateStyle(); } private void updateStyle() { final PseudoClass finishedPseudoClass = PseudoClass.getPseudoClass("green"); pseudoClassStateChanged(finishedPseudoClass, false); value.ifPresent((final Person d) -> { final boolean enableStyle = (d.getFirstName().startsWith("E")); pseudoClassStateChanged(finishedPseudoClass, enableStyle); }); } private void requestUpdateStyle() { if (styleWaitTimer == null) { styleWaitTimer = new PauseTransition(styleWaitDuration); styleWaitTimer.setOnFinished((final ActionEvent actionEvent) -> { styleWaitTimer = null; updateStyle(); }); styleWaitTimer.playFromStart(); } } }
Partager