Blabsl
Blabsl

Reputation: 125

JavaFX - cannot get ToggleButtons into ToggleGroup

I have an application where the user should be able to select only one button.

My Problem is, that I cannot get the ToggleButtons into a ToggleGroup, which should solve my problem.

I create the ToggleButtons with an if-statement. I reduced the code to the important parts. Any help?

My Code:

public SymbolTableCell() {
}

@FXML
public void initialize() {
    collectFonts();
    buildGridPaneAddButtons();
    listView.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent t) {
            buildGridPaneAddButtons();
@FXML
    public void buildGridPaneAddButtons() {
        gridPane.getChildren().clear();
        int numRows = 14;
        int numColumns = 14;
        for (int row = 0; row < numRows; row++) {
            RowConstraints rc = new RowConstraints();
            rc.setFillHeight(true);
            rc.setVgrow(Priority.ALWAYS);
            gridPane.getRowConstraints().add(rc);
        }
        for (int col = 0; col < numColumns; col++) {
            ColumnConstraints cc = new ColumnConstraints();
            cc.setFillWidth(true);
            cc.setHgrow(Priority.ALWAYS);
            gridPane.getColumnConstraints().add(cc);
        }

        String selectedFamily = listView.getSelectionModel().getSelectedItem();
        if (selectedFamily != null) {
            System.out.println("selected Font: '" + selectedFamily + "'");
            for (int i = 0; i < 196; i++) {
                Font selectedFont = Font.font(selectedFamily, 18.0);
                Character character = new Character((char) (i));
                java.awt.Font awtFont = new java.awt.Font(selectedFamily, 0, 40);

                if (awtFont.canDisplay(character.charValue())  {
                    ToggleButton buttonForSymbols = createButton("" + character);
                    buttonForSymbols.setFont(selectedFont);
                    buttonForSymbols.setAlignment(Pos.CENTER);

// Here I try to get the ToggleButtons into the Group.
                    ToggleGroup groupForToggleButtons = new ToggleGroup();
                    buttonForSymbols.setToggleGroup(groupForToggleButtons);

                    HBox symbolHBox = new HBox();
                    symbolHBox.getChildren().add(buttonForSymbols);

                    Label symbolLabel = new Label();
                    symbolLabel.setText("" + i);

                    Separator symbolSeparator = new Separator();

                    BorderPane symbolBorderPane = new BorderPane();
                    symbolBorderPane.setTop(symbolHBox);
                    symbolBorderPane.setCenter(symbolSeparator);
                    symbolBorderPane.setBottom(symbolLabel);
                    symbolLabel.setAlignment(Pos.CENTER);
                    symbolBorderPane.setAlignment(symbolLabel, Pos.CENTER);

                    // when ToggleButton selected, set new Style of BorderPane
                    symbolBorderPane.styleProperty()
                            .bind(Bindings.when(buttonForSymbols.selectedProperty())
                                    .then("-fx-border-color: red; -fx-border-width: 1.5;")
                                    .otherwise("-fx-border-color: black; -fx-border-width: 1;"));                       
                    gridPane.add(symbolBorderPane, i % numRows, i / numColumns);

                }
            }
        }
    }

    // ToggleButton to use .then .otherwise style properties
    private ToggleButton createButton(String text) {
        ToggleButton buttonPanelForSymbols = new ToggleButton(text);
        buttonPanelForSymbols.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        buttonPanelForSymbols.setOnAction(e -> System.out.println("ok"));
        buttonPanelForSymbols.setStyle(
                "-fx-border-color: transparent; -fx-border-width: 0; -fx-background-radius: 0; -fx-background-color: transparent;");
        return buttonPanelForSymbols;
    }

Upvotes: 1

Views: 765

Answers (1)

DVarga
DVarga

Reputation: 21799

On this line:

ToggleGroup groupForToggleButtons = new ToggleGroup();

you are creating a new ToggleGroup for each ToggleButton as you are executing this command inside the for loop that generates the button.

Create the ToggleGroup outside of the loop:

ToggleGroup groupForToggleButtons = new ToggleGroup();
for (int i = 0; i < 196; i++) {
    ...
}

then inside the loop use this ToggleGroup instance for each ToggleButton (remove the ToggleGroup initialization inside the loop).

Note: You could even encapsulate this in the createButton method:

private ToggleButton createButton(String text, ToggleGroup group) {
    ToggleButton buttonPanelForSymbols = new ToggleButton(text);
    // Current code here
    buttonPanelForSymbols.setToggleGroup(group)
    return buttonPanelForSymbols;
}

then in the loop:

ToggleButton buttonForSymbols = createButton("" + character, groupForToggleButtons);

while removing every ToggleGroup related from the loop.

Upvotes: 4

Related Questions