2016-09-27 2 views
1

J'ai une application où l'utilisateur devrait pouvoir sélectionner seulement un bouton.JavaFX - ne peut pas obtenir ToggleButtons dans ToggleGroup

Mon problème est, que je ne peux pas obtenir le ToggleButton s dans un ToggleGroup, ce qui devrait résoudre mon problème.

Je crée les ToggleButton s avec une instruction if. J'ai réduit le code aux parties importantes. Toute aide?

Mon 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; 
    } 

Répondre

3

Sur cette ligne:

ToggleGroup groupForToggleButtons = new ToggleGroup(); 

vous créez une nouvelle ToggleGroup pour chaque ToggleButton que vous exécutez cette commande à l'intérieur du for loop qui génère le bouton.

Créer le ToggleGroup extérieur de la boucle:

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

puis à l'intérieur de la boucle utiliser l'instance ToggleGroup pour chaque ToggleButton (supprimer l'initialisation ToggleGroup intérieur de la boucle).

Note: Vous pouvez même résumer cela dans la méthode createButton:

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

puis dans la boucle:

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

tout en enlevant tous les ToggleGroup liés de la boucle.

+0

Merci beaucoup! – Blabsl