erreur: JavaFX Application Thread" java.lang.ClassCastException
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:
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:
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:
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:
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:
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