Bonsoir,
j'ai essayé de pratiquer l'exemple qui se trouve à l'adresse:http://www.javafxapps.in/tutorial/Pe...-Database.html. le programme se compile et s'exécute sans problème. le problème survient quand je clique sur le button save. le programme lance l'erreur suivante:
voici la classe contrôler:
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 Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.control.TableColumn cannot be cast to javafx.scene.control.TableColumn$CellDataFeatures at javafx.scene.control.cell.PropertyValueFactory.call(PropertyValueFactory.java:98) at com.sun.javafx.scene.control.skin.TableRowSkin.getCell(TableRowSkin.java:80) at com.sun.javafx.scene.control.skin.TableRowSkin.getCell(TableRowSkin.java:46) at com.sun.javafx.scene.control.skin.TableRowSkinBase.createCell(TableRowSkinBase.java:652) at com.sun.javafx.scene.control.skin.TableRowSkinBase.recreateCells(TableRowSkinBase.java:646) at com.sun.javafx.scene.control.skin.TableRowSkinBase.init(TableRowSkinBase.java:145) at com.sun.javafx.scene.control.skin.TableRowSkin.<init>(TableRowSkin.java:57) at javafx.scene.control.TableRow.createDefaultSkin(TableRow.java:217) at javafx.scene.control.Control.impl_processCSS(Control.java:876) at javafx.scene.Node.processCSS(Node.java:8732) at javafx.scene.Node.processCSS(Node.java:8725) at javafx.scene.Node.processCSS(Node.java:8725) at javafx.scene.Node.processCSS(Node.java:8725) at javafx.scene.Node.processCSS(Node.java:8725) at javafx.scene.Node.applyCss(Node.java:8825) at javafx.scene.Node.impl_processCSS(Node.java:8746) at com.sun.javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1799) at com.sun.javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1689) at com.sun.javafx.scene.control.skin.VirtualFlow.getCellLength(VirtualFlow.java:1714) at com.sun.javafx.scene.control.skin.VirtualFlow.computeViewportOffset(VirtualFlow.java:2305) at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1094) at javafx.scene.Parent.layout(Parent.java:1076) at javafx.scene.Parent.layout(Parent.java:1082) at javafx.scene.Parent.layout(Parent.java:1082) at javafx.scene.Scene.doLayoutPass(Scene.java:576) at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2386) at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:322) at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:320) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:320) at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:349) at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:479) at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460) at com.sun.javafx.tk.quantum.QuantumToolkit$13.run(QuantumToolkit.java:327) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112) at java.lang.Thread.run(Thread.java:744)
la classe UserData:
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 public class FXMLController implements Initializable { @FXML private TableView table; @FXML private TableColumn col1; @FXML private TableColumn col2; @FXML private TextField name; @FXML private TextField email; private ObservableList<UserData> data; private Connection conn; private Statement stm; private PreparedStatement prep; private ResultSet result; /** * Initializes the controller class. */ @Override public void initialize(URL url, ResourceBundle rb) { try { conn = CreateConnection.getConnection(); stm = conn.createStatement(); stm.executeUpdate(" drop table user if exists;"); stm.executeUpdate("create table user(Name varchar(50),Email varchar(50))"); data = FXCollections.observableArrayList(); result = conn.createStatement().executeQuery("select *from user"); while (result.next()) { data.add(new UserData(result.getString("Name"), result.getString("Email"))); } col1.setCellFactory(new PropertyValueFactory("Name")); col2.setCellFactory(new PropertyValueFactory("Email")); //table.setItems(null); table.setItems(data); } catch (IOException ex) { Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex); } } @FXML private void saveData(ActionEvent event) throws SQLException { String query = "insert into user values(?,?);"; prep = conn.prepareStatement(query); prep.setString(1, name.getText()); prep.setString(2, email.getText()); prep.execute(); data.add(new UserData(name.getText(), email.getText())); name.setText(null); email.setText(null); } }
le fichier FXML:
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 public class UserData { private StringProperty Name; private StringProperty Email; UserData(String Name, String Email) { this.Name = new SimpleStringProperty(Name); this.Email = new SimpleStringProperty(Email); } public StringProperty NameProperty() { return Name; } public StringProperty EmailProperty() { return Email; } }
la classe Main:
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 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.geometry.*?> <?import javafx.scene.text.*?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxdatabase.FXMLController"> <bottom> <TableView fx:id="table" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> <columns> <TableColumn fx:id="col1" prefWidth="75.0" text="Name" /> <TableColumn fx:id="col2" prefWidth="75.0" text="Email" /> </columns> </TableView> </bottom> <center> <GridPane BorderPane.alignment="CENTER"> <columnConstraints> <ColumnConstraints hgrow="SOMETIMES" maxWidth="290.0" minWidth="10.0" prefWidth="155.0" /> <ColumnConstraints hgrow="SOMETIMES" maxWidth="435.0" minWidth="10.0" prefWidth="435.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> <children> <Label text="Name:" /> <Label text="Email" GridPane.rowIndex="1" /> <TextField fx:id="name" GridPane.columnIndex="1" /> <TextField fx:id="email" GridPane.columnIndex="1" GridPane.rowIndex="1" /> <Button mnemonicParsing="false" onAction="#saveData" text="save" GridPane.columnIndex="1" GridPane.rowIndex="2" /> </children> <padding> <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> </padding> </GridPane> </center> <top> <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER"> <children> <Label alignment="CENTER" text="Persisting table view "> <font> <Font size="24.0" /> </font> </Label> </children> </HBox> </top> </BorderPane>
le SGBD utilisé est H2 embedded.
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 public class JavaFXDatabase extends Application { @Override public void start(Stage stage) throws IOException { Parent root = (Parent) FXMLLoader.load(getClass().getResource("FXML.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } }
merci d'avance
Partager