JavaFX 随机化网格窗格约束
JavaFX randomize gridpane constraints
我制作了一个应用程序,您可以在其中按特定顺序搜索数字。这是它的样子:
目前,我已将数字按特定顺序排列。我怎么能随机化这个?例如,我希望每个按钮在每次单击按钮时都更改按钮的所有位置。问题是 GridPane 可以将节点堆叠在一个地方,使按钮隐藏在彼此后面。有没有办法设置节点不能堆叠?
另一方面,我从 post 中找到了一个方法,其中有人想切换两个按钮的位置。代码如下所示:
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);
}
我尝试制作一个包含节点的数组列表,然后使用 math.random 从数组列表中获取随机索引,然后获取随机按钮。
public static ArrayList<Node> buttonList = new ArrayList<Node>();
和随机化索引的代码:
public static int maxListValue = 19;
public static int minListValue = 0;
public static int listRandom = (int) (Math.random() * maxListValue) + minListValue;
然后,我尝试使用交换方法:
swap(buttonList.get(listRandom), buttonList.get(listRandom));
由于某种原因这不起作用,当我将随机放在第一个节点上时按钮什么都不做,但是,如果我将其更改为指定第一个节点,例如:swap(buttonOne, buttonList.get(listRandom));
然后它起作用,但是调用多个按钮的方法不起作用,它只在方法的第一行起作用。
如果有任何关于为什么这不起作用的提示,我们将不胜感激
调用arraylist后需要把选中的地方去掉,然后重新计算listRandom。你可以这样做:
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);
}
}
}
我制作了一个应用程序,您可以在其中按特定顺序搜索数字。这是它的样子:
目前,我已将数字按特定顺序排列。我怎么能随机化这个?例如,我希望每个按钮在每次单击按钮时都更改按钮的所有位置。问题是 GridPane 可以将节点堆叠在一个地方,使按钮隐藏在彼此后面。有没有办法设置节点不能堆叠?
另一方面,我从 post 中找到了一个方法,其中有人想切换两个按钮的位置。代码如下所示:
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);
}
我尝试制作一个包含节点的数组列表,然后使用 math.random 从数组列表中获取随机索引,然后获取随机按钮。
public static ArrayList<Node> buttonList = new ArrayList<Node>();
和随机化索引的代码:
public static int maxListValue = 19;
public static int minListValue = 0;
public static int listRandom = (int) (Math.random() * maxListValue) + minListValue;
然后,我尝试使用交换方法:
swap(buttonList.get(listRandom), buttonList.get(listRandom));
由于某种原因这不起作用,当我将随机放在第一个节点上时按钮什么都不做,但是,如果我将其更改为指定第一个节点,例如:swap(buttonOne, buttonList.get(listRandom));
然后它起作用,但是调用多个按钮的方法不起作用,它只在方法的第一行起作用。
如果有任何关于为什么这不起作用的提示,我们将不胜感激
调用arraylist后需要把选中的地方去掉,然后重新计算listRandom。你可以这样做:
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);
}
}
}