1
votes

Comment ajouter un tableau 5x5 de forme rectangle

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:

Output

Je veux que ça ressemble ceci:

 Résultat recherché


0 commentaires

3 Réponses :


2
votes

É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);
    }
}


0 commentaires

2
votes

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.


0 commentaires

2
votes

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é.


0 commentaires