Bonsoir tout le monde;
j'aimerais une explication sur les deux instructions suivantes:
si j'ai bien lit et compris les documentations sur le Net, les deux instructions sont équivalente; la signification est la suivante: il existe un attribut name de type StringProperty dans la classe userData qu'on veut lier à la colonne col1; est ce vrai çà?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 //col1.setCellFactory(new PropertyValueFactory<UserData, String>("name")); col1.setCellValueFactory(new Callback<CellDataFeatures<UserData, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<UserData, String> p) { return p.getValue().nameProperty(); } });
si les deux instruction sont vraiment équivalentes; dans le code ci dessous , pour quoi la première (la forme abrégée) me génère une erreur et la deuxième (plus longue) se compile normale.
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 public class FXMLController implements Initializable { @FXML private TableView<UserData> table; @FXML private TableColumn<UserData, String> col1; @FXML private TableColumn<UserData, String> 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<UserData, String>("name")); génère une erreur col1.setCellValueFactory(new Callback<CellDataFeatures<UserData, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<UserData, String> p) { return p.getValue().nameProperty(); } }); // col2.setCellFactory(new PropertyValueFactory<UserData, String>("Email")); génère une erreur col2.setCellValueFactory(new Callback<CellDataFeatures<UserData, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<UserData, String> p) { return p.getValue().emailProperty(); } }); 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); } } }
l'erreur générée est la 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 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; } public String getName(){ return name.get( ); } public void setName(String v){ name.set(v); } public String getEmail(){ return email.get(); } public void setEmail(String v){ email.set(v); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 error: incompatible types: PropertyValueFactory<UserData,String> cannot be converted to Callback<TableColumn<UserData,String>,TableCell<UserData,String>> col1.setCellFactory(new PropertyValueFactory<UserData, String>("name")); Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
Partager