JavaFX随机化网格窗格约束

JavaFX随机化网格窗格约束,java,javafx,Java,Javafx,我制作了一个应用程序,你可以按特定顺序搜索数字。这就是它的样子: 目前,我已将这些数字按特定顺序排列。我怎么能把它随机化呢?例如,我希望每次单击按钮时,每个按钮都更改按钮的所有位置。问题是GridPane可以将节点堆叠在一个地方,使按钮相互隐藏。是否有一种方法可以设置节点无法堆叠 另一方面,我在一篇文章中找到了一种方法,有人想切换两个按钮的位置。代码如下所示: public static void swap(Node button1, Node button2) { Integer te

我制作了一个应用程序,你可以按特定顺序搜索数字。这就是它的样子:

目前,我已将这些数字按特定顺序排列。我怎么能把它随机化呢?例如,我希望每次单击按钮时,每个按钮都更改按钮的所有位置。问题是GridPane可以将节点堆叠在一个地方,使按钮相互隐藏。是否有一种方法可以设置节点无法堆叠

另一方面,我在一篇文章中找到了一种方法,有人想切换两个按钮的位置。代码如下所示:

public static void swap(Node button1, Node button2) {
    Integer temp = GridPane.getRowIndex(button1);
    GridPane.setRowIndex(button1, GridPane.getRowIndex(button2));
    GridPane.setRowIndex(button2, temp);

    temp = GridPane.getColumnIndex(button1);
    GridPane.setColumnIndex(button1, GridPane.getColumnIndex(button2));
    GridPane.setColumnIndex(button2, temp);

}
我尝试创建一个包含节点的arraylist,然后使用math.random从arraylist中获取一个随机索引,然后获得一个随机按钮

public static ArrayList<Node> buttonList = new ArrayList<Node>();
然后,使用交换方法,我尝试:

swap(buttonList.get(listRandom), buttonList.get(listRandom));
由于某些原因,这不起作用,当我在第一个节点上放置random时,按钮不起任何作用,但是,如果我将其更改为指定第一个节点,例如:
swap(buttonOne,buttonList.get(listRandom))
然后它就可以工作了,但是为多个按钮调用该方法不起作用,它只在方法的第一行起作用


如果您能提供有关此操作不起作用的任何提示,将不胜感激。

调用arraylist后,您需要从arraylist中删除所选位置,然后重新计算它。你可以这样做:

Random random = new Random();
public static Node listRandom() {
    Node place = buttonList.get(random.nextInt(buttonList.size());
    buttonList.remove(place);
    return place;
}
或者,如果您不想删除该条目,以便可以多次交换位置,请执行以下操作:

public static Node listRandom() {
    return buttonList.get(random.nextInt(buttonList.size());
}
然后你可以用以下方式来称呼它:

swap(listRandom(), listRandom());

调用arraylist后,需要从arraylist中删除所选位置,然后重新计算它。你可以这样做:

Random random = new Random();
public static Node listRandom() {
    Node place = buttonList.get(random.nextInt(buttonList.size());
    buttonList.remove(place);
    return place;
}
或者,如果您不想删除该条目,以便可以多次交换位置,请执行以下操作:

public static Node listRandom() {
    return buttonList.get(random.nextInt(buttonList.size());
}
然后你可以用以下方式来称呼它:

swap(listRandom(), listRandom());

您可以做的另一件事是使用
Collections.shuffle
将列表随机化

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.stage.Stage;

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

    Random random = new Random();
    int numberOfRows = 5;
    int numberOfColumns = 4;

    @Override
    public void start(Stage primaryStage)
    {
        List<Button> buttonList = new ArrayList();
        for (int i = 0; i < numberOfColumns * numberOfRows; i++) {
            Button button = new Button(Integer.toString(i + 1));
            button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
            buttonList.add(button);
        }

        GridPane gridPane = new GridPane();
        addButtonsToGridPane(gridPane, buttonList);
        gridPane.setPadding(new Insets(20, 20, 20, 20));

        Button btn = new Button();
        btn.setText("Press Me!");
        btn.setOnAction((ActionEvent event) -> {
            Collections.shuffle(buttonList);//Shuffle the List of Circles.
            for(int i = 0; i < numberOfColumns * numberOfRows; i++) 
            { 
                Button c = buttonList.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 addButtonsToGridPane(GridPane gridPane, List<Button> buttonsList)
    {
        for (int i = 0; i < numberOfColumns * numberOfRows; i++) {
            gridPane.add(buttonsList.get(i), i % numberOfColumns, i / numberOfColumns);
        }
    }
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入java.util.Random;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.control;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
/**
*
*@author blj0011
*/
公共类应用程序扩展应用程序
{
随机=新随机();
int numberOfRows=5;
int numberOfColumns=4;
@凌驾
公共无效开始(阶段primaryStage)
{
列表按钮列表=新建ArrayList();
对于(int i=0;i{
Collections.shuffle(buttonList);//洗牌圆圈列表。
对于(int i=0;i
您可以做的另一件事是使用
Collections.shuffle
将列表随机化

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.stage.Stage;

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

    Random random = new Random();
    int numberOfRows = 5;
    int numberOfColumns = 4;

    @Override
    public void start(Stage primaryStage)
    {
        List<Button> buttonList = new ArrayList();
        for (int i = 0; i < numberOfColumns * numberOfRows; i++) {
            Button button = new Button(Integer.toString(i + 1));
            button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
            buttonList.add(button);
        }

        GridPane gridPane = new GridPane();
        addButtonsToGridPane(gridPane, buttonList);
        gridPane.setPadding(new Insets(20, 20, 20, 20));

        Button btn = new Button();
        btn.setText("Press Me!");
        btn.setOnAction((ActionEvent event) -> {
            Collections.shuffle(buttonList);//Shuffle the List of Circles.
            for(int i = 0; i < numberOfColumns * numberOfRows; i++) 
            { 
                Button c = buttonList.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 addButtonsToGridPane(GridPane gridPane, List<Button> buttonsList)
    {
        for (int i = 0; i < numberOfColumns * numberOfRows; i++) {
            gridPane.add(buttonsList.get(i), i % numberOfColumns, i / numberOfColumns);
        }
    }
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入java.util.Random;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.control;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
/**
*
*@author blj0011
*/
公共类应用程序扩展应用程序
{
随机=新随机();
int numberOfRows=5;
int numberOfColumns=4;
@凌驾
公共无效开始(阶段primaryStage)
{
列表按钮列表=新建ArrayList();
对于(int i=0;i{
Collections.shuffle(buttonList);//洗牌圆圈列表。
对于(int i=0;i