случайное отображение кругов в ячейках gridPane в javaFX

Я создаю приложение, которое случайным образом отображает круги (разных цветов) в каждой ячейке gridPane.

Что я хочу сделать, так это создать кнопку «перетасовки», которая случайным образом меняет положение каждого круга в gridPane. Тем не менее, я продолжаю сталкиваться с кучей проблем.

Вот что у меня есть до сих пор. Мои два класса (не добавили файл XML):

Класс контроллера

public class viewController {

//My two Variables, a gridPane and a button

    @FXML
    private GridPane matrix;
    @FXML
    private Button shuffleBut;


//my eventHandler event that should (1) add circles to all the cells, and 
(2) shuffle them amongst the cells in the gridPane.  

void shuffle(ActionEvent e) {
    Random r = new Random ();
    int rowShuffle = r.next((4-0)+1);
    int colShuffle = r.next((4-0)+1);
    Circle newCircle = new Circle ();
    matrix.add(newCircle, rowShuffle,  colShuffle );

}

Основной класс

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {

    // just load fxml file and display it in the stage:


    Parent root = FXMLLoader.Load(getClass().getResource("mainUI.fxml"));
    Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    primaryStage.show();
}

// main method to support non-JavaFX-aware environments:

public static void main(String[] args) {
    // starts the FX toolkit, instantiates this class, 
    // and calls start(...) on the FX Application thread:
    launch(args); 
}

person Leemi    schedule 10.12.2018    source источник
comment
Создайте ArrayList кругов. Перемешайте List. Добавьте список в файл GridPane. Нужно перетасовать снова? Удалите Circles из GridPane. Перемешайте List. Добавьте Circles обратно к GridPane.   -  person Sedrick    schedule 10.12.2018


Ответы (1)


Вот пример, демонстрирующий, как перетасовывать Circles в GridPane. Если вы добавите Circles к ArrayList, вы можете удалить Circles из GridPane. Затем вы можете перетасовать List. Наконец, вы можете добавить перетасованный список обратно в файл GridPane.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication314 extends Application
{

    Random random = new Random();
    int numberOfRows = 25;
    int numberOfColumns = 25;

    @Override
    public void start(Stage primaryStage)
    {
        List<Circle> circles = new ArrayList();
        for (int i = 0; i < numberOfColumns * numberOfRows; i++) {
            circles.add(new Circle(10, getRandomColor()));
        }

        GridPane gridPane = new GridPane();
        addCirclesToGridPane(gridPane, circles);
        gridPane.setPadding(new Insets(20, 20, 20, 20));

        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            Collections.shuffle(circles);//Shuffle the List of Circles.
            for(int i = 0; i < numberOfColumns * numberOfRows; i++) 
            { 
                Circle c = circles.get(i); 
                GridPane.setColumnIndex(c, i % numberOfColumns); 
                GridPane.setRowIndex(c, i / numberOfColumns); 
            }
        });

        VBox vBox = new VBox(gridPane, new StackPane(btn));
        vBox.setMaxSize(Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);
        StackPane root = new StackPane(vBox);
        root.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        Scene scene = new Scene(root);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

    public void addCirclesToGridPane(GridPane gridPane, List<Circle> circles)
    {
        for (int i = 0; i < numberOfColumns * numberOfRows; i++) {
            gridPane.add(circles.get(i), i % numberOfColumns, i / numberOfColumns);
        }
    }

    public Color getRandomColor()
    {
        int r = random.nextInt(255);
        int g = random.nextInt(255);
        int b = random.nextInt(255);

        return Color.rgb(r, g, b);
    }
}
person Sedrick    schedule 10.12.2018
comment
Спасибо за вашу помощь! Я проработаю этот пример. - person Leemi; 10.12.2018
comment
Обновлен ответ для работы с любым количеством строк и столбцов. - person Sedrick; 10.12.2018
comment
На самом деле вам не нужно удалять/считывать строки/столбцы. Вы можете просто обновить индексы столбцов/строк кругов: for (int i = 0; i < numberOfColumns * numberOfRows; i++) { Circle c = circles.get(i); GridPane.setColumnIndex(c, i % numberOfColumns); GridPane.setRowIndex(c, i / numberOfColumns); } - person fabian; 11.12.2018
comment
Обновление с использованием улучшений @fabian. Спасибо! Я не знал об этих статических методах. - person Sedrick; 11.12.2018