当前位置: 首页 > 知识库问答 >
问题:

在javaFX中随机显示网格窗格单元格中的圆圈

贡俊
2023-03-14

我正在创建一个应用程序,在一个gridPane的每个单元格内随机显示圆形(不同颜色)。

我想做的是创建一个“shuffle”按钮,在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); 
}

共有1个答案

吴谦
2023-03-14

下面是一个示例,演示如何在 GridPane 中对圆圈进行随机排列。如果将圆圈添加ArrayList,则可以从 GridPane 中删除圆圈。然后,您可以对列表进行随机排序。最后,您可以将随机排列的列表添加回 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);
    }
}
 类似资料:
  • 我想这可能是图像后的行和列的问题,但是我已经尝试了一些方法,但没有成功。非常感谢任何帮助。谢谢

  • 在我的项目中,我有一个包含多个值的ComboBox。当我的应用程序开始时,我执行以下操作: 其中是字符串列表。 同时,在应用程序中,可以更改此值。但是,由于我已经将此组合框添加到我的GridPane中,然后在该值更改(gui.columns)时添加到场景中,因此新值没有显示在组合框中。因为我已经添加了旧的gui.course。有没有办法用新的gui.course_P更新createTestButt

  • 问题内容: 我正在创建一个应用程序,该应用程序在gridPane的每个单元格内随机显示(不同颜色的)圆圈。 我想要做的是创建一个“随机播放”按钮,以随机更改gridPane中每个圆的位置。但是,我一直遇到很多问题。 这是我到目前为止所拥有的。我的两个类(尚未添加XML文件): 控制器类 主班 问题答案: 这是一个示例,演示了如何在。如果添加了一个,你可以删除从。然后,您可以随机播放。最后,您可以将

  • 好吧,如上所述,我在我的javafx应用程序中有网格窗格,并且我试图获取它,以便当我将鼠标悬停在单个单元格上时,鼠标所在的单元格将变为黄色(认为excel有点东西)。我不知道如何做到这一点,然后在鼠标离开手机后重置它。 这就是我现在拥有它的方式,但它只是在鼠标悬停时改变一种颜色,然后保持该颜色。整个表格也不会更改每个单元格。有人帮忙吗?

  • 我试图将乘法VBox添加到scrollpane中的gridpane(在下面的codesnippet中称为refPane)。 它在一行中添加不超过ITEMS_PER_ROW的Vbox,并在下一行中继续。也不应该有更多的行,然后ITEMS_PER_COLUM可见。问题是,如果我添加更多的ITEMS_PER_ROW*ITEMS_PER_COLUMN到网格中,而不是obingbeingscrollable

  • 我在fxml中有一个GridPane,它有一个文本标题和4个按钮。GridPane本身是居中对齐的,但所有按钮都在网格的列内左对齐。我知道如何使用Java代码更改项目的对齐方式,但这不是理想的情况,因为我希望所有样式都使用FXML和CSS处理。有谁能建议在JavaFX的GridPane视图中居中对齐单元格元素的最佳方法吗?