Je viens de rejoindre et j'ai commencé à apprendre JavaFX et j'ai du mal à ajouter un tableau 5x5 de forme rectangulaire avec des couleurs dessus. Voici ma progression:
public void start(Stage primaryStage) { GridPane grid = new GridPane(); Random rand = new Random(); ArrayList<String> colors = new ArrayList<String>(); colors.add("ff0000");//red colors.add("#008000");//green colors.add("#0000ff");//blue colors.add("#ffff00");//yellow int row = 0; int col = 0; for (int i = 0; i < 26; i++) { Rectangle rect = new Rectangle(100, 100, 50, 50); rect.setFill(Color.web(colors.get(rand.nextInt(4)))); rect.setStroke(Color.BLACK); grid.add(rect, row, col); if (row < 4) { row++; } if (col < 4) { col++; } } grid.setAlignment(Pos.CENTER); Scene scene = new Scene(grid, 500, 500);
Voici la sortie:
Je veux que ça ressemble ceci:
3 Réponses :
Écrivez votre boucle comme suit:
for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; ++) Rectangle rect = new Rectangle(100, 100, 50, 50); rect.setFill(Color.web(colors.get(rand.nextInt(4)))); rect.setStroke(Color.BLACK); grid.add(rect, i, j); } }
Pensez à faire une boucle externe / interne pour indexer correctement la ligne et la colonne:
for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { Rectangle rect = new Rectangle(100, 100, 50, 50); rect.setFill(Color.web(colors.get(rand.nextInt(4)))); rect.setStroke(Color.BLACK); grid.add(rect, i, j); } }
Pour mieux comprendre pourquoi cela fonctionne, essayez d'imprimer la ligne
et col
en haut de la boucle for vs impression des valeurs i
et j
dans ce code. Vous pouvez alors voir la différence.
Dans les 4 premières itérations de la boucle, vous incrémentez à la fois la ligne
et la colonne
et dans toutes les autres itérations vous ne les incrémentez pas du tout mais mettez les rects dans le cellule en bas à droite. De plus, votre boucle effectue 26 itérations, et non 25 = 5 * 5.
Pour corriger l'erreur, vous devez incrémenter la ligne uniquement lorsque vous avez atteint la fin d'une ligne et réinitialiser la colonne à 0 en même temps :
for (int i = 0; i < (columns * rows); ++i) { row = i / columns; column = i % columns;
Vous pouvez également utiliser le résultat de la division tronquée et l'opérateur de reste pour calculer la colonne / ligne à partir de i
XXX
Habituellement, une boucle imbriquée comme démontré dans les autres réponses serait préférable, mais je pensais que je fournirais des alternatives et expliquerais où vous vous êtes trompé.