Как добавить таблицу 5х5 прямоугольной формы - PullRequest
1 голос
/ 01 апреля 2020

Я только что присоединился и начал изучать JavaFX, и у меня возникают проблемы с добавлением таблицы прямоугольной формы 5x5 с цветами на ней. Вот мой прогресс:

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

Вот вывод:

Output

Я хочу, чтобы это выглядело так:

Wanted Result

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Попробуйте сделать внешний / внутренний l oop для правильного индексирования строки и столбца:

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

Чтобы лучше понять, почему это работает, попробуйте напечатать значения row и col вверху из для l oop против печати значений i и j в этом коде. Вы можете увидеть разницу.

2 голосов
/ 01 апреля 2020

В первых 4 итерациях l oop вы увеличиваете и row, и column, а во всех остальных итерациях вы вообще не увеличиваете их, а помещаете их в нижнюю правую ячейку. Кроме того, ваш l oop выполняет 26 итераций, а не 25 = 5 * 5.

. Чтобы исправить ошибку, вам нужно увеличивать строку только после достижения конца строки и сброса столбца. в 0 одновременно:

final int columns = 5:
final int rows = 5
int row = 0;
int column = 0;

for (int i = 0; i < (columns * rows); ++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, col, row);

    ++column; // move to right

    // if we exceed the available horizontal space, start new row
    if (column >= columns) {
        column = 0;
        row++;
    }
}

В качестве альтернативы вы можете использовать результат усечения деления и оператор остатка для вычисления столбца / строки из i

for (int i = 0; i < (columns * rows); ++i) {
    row = i / columns;
    column = i % columns;

Обычно хотя вложенный l oop, как показано в других ответах, был бы предпочтительнее, но я бы хотел предоставить несколько альтернатив и объяснить, где вы ошиблись.

2 голосов
/ 01 апреля 2020

Напишите свой l oop следующим образом:

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