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:
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)
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
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);
    }
 
}
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
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;
        }
    }
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
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>
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
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);
    }
 
}
le SGBD utilisé est H2 embedded.
merci d'avance