Bonjour,
Je souhaite créer un Slider dont les valeurs et labels correspondraient à des énumérations.
Dans mon cas, je développe un outil pour l'école de musique de mon village et, pour le niveau des élèves que l'on édite, je souhaite que l'on puisse ajuster le niveau avec un slider.
Il y a plusieurs niveaux : Eveil, débutant, élémentaire, intermédiaire et avancé.
voici l'Enum que j'ai faite :
J'ai créé des énums avec un attribut int et un String. L'int servira à la valeur du slider et la String servira aux labels du slider.
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 public enum Niveaux { EVEIL(0, "Eveil"), DEBUTANT(1, "Débutant"), ELEMENTAIRE(2, "Elémentaire"), INTERMEDIAIRE(3, "Intermédiaire"), AVANCE(4, "Avancé"); private String strNiveau; private int intNiveau; private Niveaux(int intNiveau_, String strNiveau_){ this.strNiveau = strNiveau_; this.intNiveau = intNiveau_; } public String getStrNiveau() {return strNiveau;} public int getIntNiveau() {return intNiveau;} }
voici la classe Eleve qui hérite de Personne :
Pour le niveau, j'ai utilisé un ObjectProperty<Niveaux> mais je ne sais pas si j'ai bien fait.
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 public class Eleve extends Personne { //ATTRIBUTS private ObjectProperty<Niveaux> niveau; private BooleanProperty cotisationPayee; //CONSTRUCTORS public Eleve() { super(); this.setNiveau(Niveaux.EVEIL); this.setCotisationPayee(true); } public Eleve(String nom_, String prenom_, String adresse_, LocalDate date_naissance_, String telephone1_, String telephone2_, String email1_, String email2_, int anciennete_, List<String> instruments_) { super(nom_, prenom_, adresse_, date_naissance_, telephone1_, telephone2_, email1_, email2_, anciennete_, instruments_); } public Eleve(String nom_, String prenom_, String adresse_, LocalDate date_naissance_, String telephone1_, String telephone2_, String email1_, String email2_, int anciennete_, List<String> instruments_, Niveaux niveau_, boolean cotisationPayee_) { super(nom_, prenom_, adresse_, date_naissance_, telephone1_, telephone2_, email1_, email2_, anciennete_, instruments_); // super(nom_, prenom_, "adresse_", LocalDate.of(1999, 2, 21), "telephone1_", "telephone2_", "email1_", "email2_", 5, instruments_); this.setNiveau(niveau_); this.cotisationPayee = new SimpleBooleanProperty(cotisationPayee_); } //ACCESSORS public boolean getCotisationPayee() {return cotisationPayee.get();} public void setCotisationPayee(boolean cotisationPayee_) {this.cotisationPayee.set(cotisationPayee_);} public BooleanProperty cotisationPayeeProperty(){return cotisationPayee;} public String toStringCotisationPayee() { String strCotis = new String(); if(this.getCotisationPayee()){ strCotis = "Payée"; } else { strCotis = "Non payée"; } return strCotis; } public Niveaux getNiveau() {return niveau.get();} public void setNiveau(Niveaux niveau_) {this.niveau.set(niveau_);} public ObjectProperty<Niveaux> niveauProperty() {return niveau;} }
Voici la classe Personne :
J'ai aussi un controller nommé EleveEditDialogCtrl :
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 public class Personne { //ATTRIBUTS private StringProperty nom; private StringProperty prenom; private StringProperty adresse; private ObjectProperty<LocalDate> date_naissance; private StringProperty telephone1; private StringProperty telephone2; private StringProperty email1; private StringProperty email2; private IntegerProperty anciennete; private List<String> instruments; //CONSTRUCTEURS public Personne() {this(null, null, null, null, null, null, null, null, 0, new ArrayList<String>());} public Personne(String nom_, String prenom_, String adresse_, LocalDate date_naissance_, String telephone1_, String telephone2_, String email1_, String email2_, Integer anciennete_, List<String> instruments_) { this.nom = new SimpleStringProperty(nom_); this.prenom = new SimpleStringProperty(prenom_); this.adresse = new SimpleStringProperty(adresse_); this.date_naissance = new SimpleObjectProperty<LocalDate>(date_naissance_); this.telephone1 = new SimpleStringProperty(telephone1_); this.telephone2 = new SimpleStringProperty(telephone2_); this.email1 = new SimpleStringProperty(email1_); this.email2 = new SimpleStringProperty(email2_); this.anciennete = new SimpleIntegerProperty(anciennete_); ObservableList<String> observableList = FXCollections.observableArrayList(instruments_); this.instruments = new SimpleListProperty<String>(observableList); } //ACCESSEURS public String getNom() {return nom.get();} public void setNom(String nom) {this.nom.set(nom);} public StringProperty nomProperty(){return nom;} public String getPrenom() {return prenom.get();} public void setPrenom(String prenom) {this.prenom.set(prenom);} public StringProperty prenomProperty(){return prenom;} public String getAdresse() {return adresse.get();} public void setAdresse(String adresse) {this.adresse.set(adresse);} public StringProperty adresseProperty(){return adresse;} public LocalDate getDate_naissance() {return date_naissance.get();} public void setDate_naissance(LocalDate date_naissance) {this.date_naissance.set(date_naissance);} public ObjectProperty<LocalDate> date_naissanceProperty(){return date_naissance;} public String getTelephone1() {return telephone1.get();} public void setTelephone1(String telephone1) {this.telephone1.set(telephone1);} public StringProperty telephone1Property(){return telephone1;} public String getTelephone2() {return telephone2.get();} public void setTelephone2(String telephone2) {this.telephone2.set(telephone2);} public StringProperty telephone2Property(){return telephone2;} public String getEmail1() {return email1.get();} public void setEmail1(String email1) {this.email1.set(email1);} public StringProperty email1Property(){return email1;} public String getEmail2() {return email2.get();} public void setEmail2(String email2) {this.email2.set(email2);} public StringProperty email2Property(){return email2;} public Integer getAnciennete() {return anciennete.get();} public void setAnciennete(Integer anciennete) {this.anciennete.set(anciennete);} public List<String> getInstruments() {return instruments;} public void setInstruments(List<String> instruments) {this.instruments = instruments;} public String getInstrumentsToString(){ StringBuilder sb = new StringBuilder(); for(int i = 0; i < this.getInstruments().size(); i++){ sb.append(this.getInstruments().get(i)); if(i < this.getInstruments().size() - 1){ sb.append(", "); } } return sb.toString(); } public void setInstrumentsFromString(String instrus) { this.setInstruments(Arrays.asList(instrus.split(","))); } }
Dans ce controller, j'ai du mal à récupérer un objet Enum Niveaux et j'ai bien l'impression que c'est impossible.
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 public class EleveEditDialogCtrl { @FXML private TextField nomField; @FXML private TextField prenomField; @FXML private TextField adresseField; @FXML private TextField date_naissanceField; @FXML private TextField telephone1Field; @FXML private TextField telephone2Field; @FXML private TextField email1Field; @FXML private TextField email2Field; @FXML private TextField instrumentsField; @FXML private TextField niveauLabel; @FXML private TextField niveauValue; private Stage eleveDialogStage; private Eleve eleve; private boolean okClicked = false; /** * Initializes the controller class. This method is automatically called * after the fxml file has been loaded. */ @FXML private void initialize() { } /** * Sets the stage of this eleveDialog. * * @param dialogStage */ public void setEleveDialogStage(Stage eleveDialogStage){ this.eleveDialogStage = eleveDialogStage; } /** * Sets the Eleve to be edited in the dialog. * * @param person */ public void setEleve(Eleve eleve){ this.eleve = eleve; nomField.setText(eleve.getNom()); prenomField.setText(eleve.getPrenom()); adresseField.setText(eleve.getAdresse()); date_naissanceField.setText(DateUtil.format(eleve.getDate_naissance())); telephone1Field.setText(eleve.getTelephone1()); telephone2Field.setText(eleve.getTelephone2()); email1Field.setText(eleve.getEmail1()); email2Field.setText(eleve.getEmail2()); instrumentsField.setText(eleve.getInstrumentsToString()); niveauLabel.setText(eleve.getNiveau().getStrNiveau()); niveauValue.setText(String.valueOf(eleve.getNiveau().getIntNiveau())); } /** * Returns true if the user clicked OK, false otherwise. * * @return */ public boolean isOkClicked() { return okClicked; } @FXML private void handleOK() { if(isInputValid()){ eleve.setNom(nomField.getText()); eleve.setPrenom(prenomField.getText()); eleve.setAdresse(adresseField.getText()); eleve.setDate_naissance(DateUtil.parse(date_naissanceField.getText())); eleve.setTelephone1(telephone1Field.getText()); eleve.setTelephone2(telephone2Field.getText()); eleve.setEmail1(email1Field.getText()); eleve.setEmail2(email2Field.getText()); eleve.setInstrumentsFromString(instrumentsField.getText()); eleve.setNiveau( new Niveaux(Integer.parseInt(niveauValue.getText()), niveauLabel.getText()) ); eleve.setCotisationPayee(false); okClicked = true; eleveDialogStage.close(); } } /** * Called when the user clicks cancel. */ @FXML private void handleAnnuler(){ eleveDialogStage.close(); } /** * Validates the user input in the text fields. * * @return true if the input is valid */ private boolean isInputValid() { String errorMessage = ""; if(nomField.getText() == null || nomField.getText().length() == 0){ errorMessage += "Le champs 'nom' n'est pas valide\n"; } if(prenomField.getText() == null || prenomField.getText().length() == 0){ errorMessage += "Le champs 'prénom' n'est pas valide\n"; } if(adresseField.getText() == null){ errorMessage += "Le champs 'adresse' n'est pas valide\n"; } if (date_naissanceField.getText() == null) { errorMessage += "Le champs 'date de naissance' n'est pas valide\n"; } else { if (!DateUtil.validDate(date_naissanceField.getText())) { errorMessage += "Le champs 'date de naissance' n'est pas valide, utilisez le format jj.mm.aaaa\n"; } } if(telephone1Field.getText() == null){ errorMessage += "Le champs 'telephone 1' n'est pas valide\n"; } if(telephone2Field.getText() == null){ errorMessage += "Le champs 'telephone 2' n'est pas valide\n"; } if(email1Field.getText() == null){ errorMessage += "Le champs 'email 1' n'est pas valide\n"; } if(email2Field.getText() == null){ errorMessage += "Le champs 'email 2' n'est pas valide\n"; } if(instrumentsField.getText() == null){ errorMessage += "Le champs 'instruments' n'est pas valide\n"; } if (errorMessage.length() == 0) { return true; } else { // Show the error message. Alert alert = new Alert(AlertType.ERROR); alert.initOwner(eleveDialogStage); alert.setTitle("Champs invalides"); alert.setHeaderText("Merci de corriger les champs"); alert.setContentText(errorMessage); alert.showAndWait(); return false; } } }
Me faudra-t-il diviser l'attribut niveau dans la classe Eleve en deux attributs, 1 pour la valeur du Slider et 1 pour le label du Slider ?
et voici le fichier de l'interface graphique EleveEditDialog.fxml :
Code XML : 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 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.Slider?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.RowConstraints?> <AnchorPane prefHeight="400.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/8.0.72" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.ems.adherents.view.EleveEditDialogCtrl"> <children> <GridPane AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0"> <columnConstraints> <ColumnConstraints hgrow="SOMETIMES" maxWidth="150.0" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> </columnConstraints> <rowConstraints> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> </rowConstraints> <children> <Label text="Nom" /> <Label text="Prénom" GridPane.rowIndex="1" /> <Label text="Adresse" GridPane.rowIndex="2" /> <Label text="Tel 1" GridPane.rowIndex="4" /> <Label text="Tel 2" GridPane.rowIndex="5" /> <Label text="Email 1" GridPane.rowIndex="6" /> <Label text="Email 2" GridPane.rowIndex="7" /> <Label text="Date de naissance" GridPane.rowIndex="3" /> <Label text="Instrument" GridPane.rowIndex="8" /> <TextField fx:id="nomField" GridPane.columnIndex="1" /> <TextField fx:id="prenomField" GridPane.columnIndex="1" GridPane.rowIndex="1" /> <TextField fx:id="adresseField" GridPane.columnIndex="1" GridPane.rowIndex="2" /> <TextField fx:id="date_naissanceField" GridPane.columnIndex="1" GridPane.rowIndex="3" /> <TextField fx:id="telephone1Field" GridPane.columnIndex="1" GridPane.rowIndex="4" /> <TextField fx:id="telephone2Field" GridPane.columnIndex="1" GridPane.rowIndex="5" /> <TextField fx:id="email1Field" GridPane.columnIndex="1" GridPane.rowIndex="6" /> <TextField fx:id="email2Field" GridPane.columnIndex="1" GridPane.rowIndex="7" /> <TextField fx:id="instrumentsField" GridPane.columnIndex="1" GridPane.rowIndex="8" /> <Label text="Niveau" GridPane.rowIndex="9" /> <Slider blockIncrement="20.0" majorTickUnit="20.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" GridPane.columnIndex="1" GridPane.rowIndex="9" /> </children> </GridPane> <Button mnemonicParsing="false" onAction="#handleOK" text="Valider" AnchorPane.bottomAnchor="5.0" AnchorPane.rightAnchor="5.0" /> <Button layoutX="360.0" layoutY="369.0" mnemonicParsing="false" onAction="#handleAnnuler" text="Annuler" /> </children> </AnchorPane>
Et donc, au final, je souhaite que l'on voie le slider avec les niveaux inscrits mais j'ai du mal à imaginer la meilleur manière de faire cela.
Merci pour vos aides !
Partager