Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JAVAFX] RadioButton dans une TableCell

28 juin 2020 à 18:28:11

Bonjour à tous,

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:

package utils;

import javafx.geometry.Pos;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TableCell;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;

public class RadioButtonCell<Risk,Boolean> extends TableCell<Risk,Boolean> {

    ToggleGroup toggleGroup;

    public RadioButtonCell(ToggleGroup group){
        toggleGroup = group;
    }

    @Override
    protected void updateItem(Boolean item, boolean empty){
        super.updateItem(item, empty);

        System.out.println(toggleGroup.getToggles().size());

        if (item != null){

            // gui setup
            HBox hb = new HBox(7);
            hb.setAlignment(Pos.CENTER);

            RadioButton radioButton = new RadioButton();
            radioButton.setUserData(item);
            radioButton.setToggleGroup(this.toggleGroup);
            hb.getChildren().add(radioButton);

            radioButton.setSelected((java.lang.Boolean) item);

            setGraphic(hb);

        }

    }
}

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

  • Partager sur Facebook
  • Partager sur Twitter

Parfois il faut se demander si le problème n'est pas entre l’écran et la chaise ! :)