Bonsoir tout le monde;
j'aimerais une explication sur les deux instructions suivantes:
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 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 çà?
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.
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);
        }
    }
}
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
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);
        }
    }
l'erreur générée est la suivante:
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