sur la classe PropertyValueFactory
Bonsoir tout le monde;
j'aimerais une explication sur les deux instructions suivantes:
Code:
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:
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:
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:
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 |