java - 在 JavaFX 中按下按钮时如何创建随机圆圈位置?

标签 java javafx javafx-8 shapes

我正在尝试通过 Udemy 类(class)学习 Java,我被要求在进入以下部分之前创建一个作业。

作业是编写一个显示圆圈和按钮的 JavaFX 应用程序,每次按下所述按钮时,圆圈应移动到随机位置。

到目前为止,我已经创建了一个代码来计算我点击按钮的次数,现在我想随着计数移动圆圈:

public class CircleJumper extends Application {

    // Declare Variables
    private int count;
    private Circle initCircle;
    private Button initButton;
    private Text countText;

    /*
    *
    * Write function here
    *
    */
    @Override
    public void start(Stage primaryStage){

        // Initiate Variables
        count = 0;
        initCircle = new Circle(30, -50, 30);
        initButton = new Button("Click Me!");
        countText = new Text("Clicks: 0");
        // Here its where I built the click counter
        initButton.setOnAction((event) -> {
            count++;
            countText.setText("Pushes: " + count);
        });        
        ;
        Group baseDemo = new Group(initButton, countText);

        FlowPane pane = new FlowPane(baseDemo, initCircle);
        pane.setAlignment(Pos.CENTER);
        pane.setHgap(20);
        pane.setStyle("-fx-background-color: cyan");

        Scene scene = new Scene(pane, 600, 300);

        primaryStage.setTitle("Draw a Circle when Button is Pressed");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

更新: 我决定将我的变量 count 声明为 = Math.random();并创建了一个圆圈。之后,单击按钮应该会获取生成的 Math.random 并将其放入 setTranslate 中,对吗?

    public void start(Stage primaryStage){

        // Initiate Variables
        count = Math.random();
        initCircle = new Circle(30, 50, 30);
        initButton = new Button("Click Me!");

        Group circlePos = new Group(initCircle);
        circlePos.setTranslateX(10);
        circlePos.setTranslateY(10);

        initButton.setOnAction((event) -> {
            count++;
            circlePos.setTranslateY(count);
            circlePos.setTranslateX(count);
        });

        Group baseDemo = new Group(initButton);

        FlowPane pane = new FlowPane(baseDemo, initCircle);
        pane.setAlignment(Pos.CENTER);
        pane.setHgap(20);
        pane.setStyle("-fx-background-color: cyan");

        Scene scene = new Scene(pane, 600, 300);

        primaryStage.setTitle("Draw a Circle when Button is Pressed");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

最佳答案

先自己尝试一下,但我会发布一个解决方案,以便您了解它是如何完成的,以防您遇到困难。

  1. 创建 random在你的application init method
  2. 增加点击次数的地方,get a couple of ints using random.nextInt(bound)来自随机。
  3. 设置圈子centerXcenterY 到你的随机值。
  4. 完成。

好的,还没有完全完成,当您尝试(您应该这样做)时会发现的问题是它不起作用,圆似乎不会以您设置的 x 和 y 值为中心。这是因为 Circle 位于布局 Pane (FlowPane) 中,它将忽略您的手动布局设置(尽管不会转换值)。解决方案是将圆圈放在组中(作为第一项,以便它在所有内容下),然后将流程 Pane 放在组中,并且在 FlowPane 中你有你的按钮和点击计数器。

您可能希望为动画而不是布局保留 translateX/Y,尽管它可以用来移动形状,因此也可以使用。

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.Button;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.util.Random;

public class CircleJumper extends Application {
    private static final double MAX_X = 600;
    private static final double MAX_Y = 300;

    private int clickCount = 0;
    private Random random;

    @Override
    public void init() {
        random = new Random();
    }

    @Override
    public void start(Stage stage){
        Circle circle = new Circle(MAX_X / 2, MAX_Y / 2, 30);
        Button button = new Button("Click Me!");
        Text clickCountText = new Text("Clicks: " + clickCount);

        button.setOnAction((event) -> {
            clickCount++;
            clickCountText.setText("Clicks: " + clickCount);

            circle.setCenterX(random.nextInt((int) MAX_X));
            circle.setCenterY(random.nextInt((int) MAX_Y));
        });        

        Group layout = new Group(
                circle,
                new FlowPane(button, clickCountText)
        );

        stage.setScene(new Scene(layout, MAX_X, MAX_Y, Color.CYAN));
        stage.setResizable(false);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

关于java - 在 JavaFX 中按下按钮时如何创建随机圆圈位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58001799/

相关文章:

java - 如何从其他线程更改 UI

java - 突出显示 ListCell 时 float 矩形

java - 自定义 ControlsFX 通知

java - Appium 上由 FluentWait.until 引起的 "NoSuchMethodError"

java - 什么是 JSON 提供程序以及有哪些不同类型的提供程序?

css - javafx和css如何使用变量

javafx 8 兼容性问题 - FXML 静态字段或方法

java - 今天如何在 Java 8 Ubuntu 上启动 JavaFX 应用程序?

java - 拦截器必须是bean吗?

java - BitmapFactory.decodeFile与decodeStream之间的区别