2013-07-13 3 views
0

je travaille sur cet exemple qui ne fonctionne pas correctement:Comment changer Rectangles avec des boutons

public class test extends Application 
{ 

    private void init(Stage primaryStage) 
    { 

     Group root = new Group(); 
     primaryStage.setScene(new Scene(root)); 

     String pillButtonCss = DX57DC.class.getResource("PillButton.css").toExternalForm(); 

     // create 3 toggle buttons and a toogle group for them 
     ToggleButton tb1 = new ToggleButton("Left Button"); 
     tb1.setId("pill-left"); 
     ToggleButton tb2 = new ToggleButton("Center Button"); 
     tb2.setId("pill-center"); 
     ToggleButton tb3 = new ToggleButton("Right Button"); 
     tb3.setId("pill-right"); 

     final ToggleGroup group = new ToggleGroup(); 
     tb1.setToggleGroup(group); 
     tb2.setToggleGroup(group); 
     tb3.setToggleGroup(group); 
     // select the first button to start with 
     group.selectToggle(tb1); 

     ////////////////////////////////////////// 

     final VBox vbox = new VBox(); 

     final Rectangle rect1 = new Rectangle(300, 300); 
     rect1.setFill(Color.ALICEBLUE); 
     final Rectangle rect2 = new Rectangle(300, 300); 
     rect2.setFill(Color.AQUA); 
     final Rectangle rect3 = new Rectangle(300, 300); 
     rect3.setFill(Color.AZURE); 

     tb1.setUserData(rect1); 
     tb2.setUserData(rect2); 
     tb3.setUserData(rect3); 

     group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Toggle> ov, Toggle toggle, Toggle new_toggle) 
      { 
       if (new_toggle == null) 
       { 
        //rect.setFill(Color.WHITE); 
       } 
       else 
       { 
        vbox.getChildren().addAll((Node[]) group.getSelectedToggle().getUserData()); 
        //rect.setFill((Color) group.getSelectedToggle().getUserData()); 
       } 
      } 
     }); 


     /////////////////////////////////////////// 


     HBox hBox = new HBox(); 
     hBox.getChildren().addAll(tb1, tb2, tb3); 
     hBox.setPadding(new Insets(20, 20, 260, 20)); 
     hBox.getStylesheets().add(pillButtonCss); 



     vbox.getChildren().add(hBox); 
     //vbox.getChildren().add(rect); 

     root.getChildren().add(vbox); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     init(primaryStage); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 
} 

Je veux créer plusieurs Rectangles (ou objet dans lequel ou objet) dans lequel je veux stocker des données . Je veux changer les Rectangles (objets) qui sont affichés devant l'utilisateur en utilisant les boutons. L'exemple que j'ai implémenté ne fonctionne pas correctement. Pouvez-vous me dire quelle est la bonne façon de mettre en œuvre cela?

Répondre

1

Vous pouvez créer un Stackpane avec le rectangle et une étiquette avec du texte dessus (si c'est les données que vous voulez stocker). Alternativement, vous pouvez également définir l'arrière-plan de n'importe quel volet pour avoir un rectangle de couleur.

Ensuite, ajoutez ce volet en tant que données utilisateur au bouton correspondant et ajoutez les boutons userdata à votre VBox en bascule.

final StackPane rect1pane = new StackPane(); 
final Rectangle rect1 = new Rectangle(300, 300); 
rect1pane.getChildren().add(rect1); 
rect1pane.getChildren().add(new Label("Some text")); 
tb1.setUserData(rect1pane); 

togglePropertyListener:

... 
else{ 
//Delete rectangles added before (or check if this one isnt already dispayed) 
if(group.getSelectedToggle().getUserData() instanceof Node) 
    vbox.getChildren().add((Node)group.getSelectedToggle().getUserData()); 
} 

Si vous voulez juste votre code exemple pour travailler le changement:

vbox.getChildren().addAll((Node[]) group.getSelectedToggle().getUserData());

à

vbox.getChildren().addAll((Node) group.getSelectedToggle().getUserData()); 

Parce que vous venez d'ajouter le Rectangle du ToggleButton sélectionné, c'est seulement un et pas un tableau. Faites agrandir votre fenêtre après un clic pour voir le rectanlge (le rembourrage inférieur de 260px ne vous aide pas car même si l'espace est vide sous hbox, il fait toujours partie de la hbox et ne peut pas être utilisé par votre rectangle ajouté) ou tout simplement se déplacer

group.selectToggle(tb1); 

à la dernière ligne de votre méthode init;)

Questions connexes