Je rencontre un problème dont je ne trouve pas la solution. J'ai une interface GUI comme celle-ci:
J'ai donc une colonne "défaut" qui contient un RadioButton. Le but de cette colonne est de sélectionner le risque par défaut, il doit donc n'y avoir que un seul risque sélectionnable. Pour cela j'ai créé un ToggleGroupe comme ceci:
public class ModifyRisksAvailableController implements Initializable {
public ToggleGroup toggleGroup = new ToggleGroup();
private ResourceBundle resourceBundle;
private ObservableList<Risk> AvailableRisks;
@FXML
TableView<Risk> settingsTableView;
@FXML
TableColumn<Risk,Boolean> ColumnCheckBox;
@FXML
TableColumn<Risk,Number> ColumnRiskValue;
@FXML
TableColumn<Risk,Boolean> ColumnIsDefaultRisk;
@FXML
Button removeButton;
/**
* Liste contenant les risques à supprimer
* -> id de la base de donnée
*/
ArrayList<String> deletedRisks = new ArrayList<>();
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
this.resourceBundle = resourceBundle;
//Colonne -> Checbkox / sélection pour suppression
ColumnCheckBox.setCellValueFactory(cellData -> cellData.getValue().checkProperty());
ColumnCheckBox.setCellFactory(column -> new CheckBoxTableCell<>());
ColumnCheckBox.setEditable(true);
ColumnCheckBox.setVisible(false);
ColumnCheckBox.setPrefWidth(24.0);
//Colonne -> Checkbox / risque par défaut
//cellData -> cellData.getValue().isDefaultRiskProperty()
ColumnIsDefaultRisk.setCellValueFactory(cellData -> cellData.getValue().isDefaultRiskProperty());
ColumnIsDefaultRisk.setCellFactory(colum -> new RadioButtonCell<>(toggleGroup));
ColumnIsDefaultRisk.setEditable(true);
//Colonne -> TextField / % de risque
ColumnRiskValue.setCellValueFactory(cellData -> cellData.getValue().riskValueProperty());
ColumnRiskValue.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter()));
ColumnRiskValue.setEditable(true);
}
}
CellData.getValue().isDefaultRiskProperty() récupére un BoleanProperty, valant true/false. J'ai créé une interface RadioButtonCell qui fait office de CellFactory, comme ceci:
Celle-ci ajoute seulement les radiosButton créer dans le ToggleGroup.
J'ai ensuite les boutons "selectionner" qui permet de supprimer les risques. Pour cela il affiche une colonne à droite, qui contient des checkbox à selectionner. Cependant au moment ou je clique sur ce bouton de sélection, 6 nouvelles ligne se créé comme-ceci:
Je pense que cela vient du rafraichissement de la TableView, lors du passage de la valeur "visible" de la colonne de false à true. J'ai essayé d'afficher la taille de ToggleList afin de voir combien d'item sont ajoutés: et j'ai remarqué que 6 sont ajoutés mais que RadioButtonCell est apellé 12 fois: ce qui correspond aux nombres de colonnes affiché (vide comprises) alors que je n'affiche que 6 lignes remplies.
Il faut savoir que le seul code éxecuter au moment du click du bouton est celui-ci:
/**
* Permet de supprimer les marchés séléctionner
* -> correspond au bouton: removeMarketButton
*/
public void removeRisksButton(){
//Affiche ou cache la colonne de sélection
ColumnCheckBox.setVisible(!ColumnCheckBox.visibleProperty().get());
if(!ColumnIsDefaultRisk.isVisible()){
removeButton.setText(resourceBundle.getString("removeButtonDefault"));
}else{
removeButton.setText(resourceBundle.getString("removeButtonSelected"));
}
if(deletedRisks.size() != 0){
//supprime les risques
Service<String> deleteRisks = Main.database.deleteRisk(deletedRisks);
//la récupération à fonctionné
deleteRisks.setOnSucceeded((WorkerStateEvent e) -> {
AlertWindow alert = new AlertWindow(
"DELETE_RISKS_SUCESSFULL_WINDOWSTITLE",
"DELETE_RISKS_SUCESSFULL_MESSAGE",
null
);
alert.show();
//rafrachit la TableView
this.initialize_settingsTableView();
//supprime tous les éléments de la liste
this.deletedRisks.clear();
});
//si la récupération à échoué
deleteRisks.setOnFailed((WorkerStateEvent e) -> {
AlertWindow alert = new AlertWindow(
"DELETE_RISKS_IMPOSSIBLE_WINDOWSTITLE",
"DELETE_RISKS_IMPOSSIBLE_MESSAGE",
null
);
alert.show();
});
}
}
Merci pour vos réponses.
- Edité par BowgartField 28 juin 2020 à 18:32:30
Parfois il faut se demander si le problème n'est pas entre l’écran et la chaise ! :)
Parfois il faut se demander si le problème n'est pas entre l’écran et la chaise ! :)