我正在尝试通过Udemy课程学习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);
    }

}

更新:我决定声明我的变量计数为= 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楼 票数:3 已采纳

请先尝试一下,但是我会发布一个解决方案,以便您查看如何完成,以防万一。

  1. 在您的应用程序初始化方法中创建一个随机数
  2. 在增加点击次数的地方, 使用random.nextInt(bound)从随机数中获得几个整数
  3. 将圆心centerXcenterY设置为随机值。
  4. 做完了

好吧,做得还不错,尝试时会发现问题(您应该这样做),它将无法工作,圆似乎不会以您设置的x和y值为中心。 这是因为“圆”位于布局窗格(FlowPane)中,该窗格将忽略您的手动布局设置(尽管不会转换值)。 解决方案是将圆放入组中(作为第一项,使其位于所有内容的下方),然后将流窗格放入组中,在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);
    }
}

  ask by Rose translate from so

未解决问题?本站智能推荐:

1回复

如何使用带有标签的形状位置

如果我显示具有特定x和y坐标的圆,则可以正常工作: 但是,如果我在圆上添加标签,则圆的位置将被忽略。 如何保持圆的位置并仅添加标签,或者如何设置正确的圆位置(包括端点)? 例如,起作用的是: 但是我正在寻找一种更集成的解决方案。 我以为Label对象可
1回复

JavaFX更改鼠标按下时的圆圈颜色

我正在使用JavaFX开发一个用于学校的简单应用程序。 我们应该创建一个白色的圆圈,当按下鼠标按钮时该圆圈将变为黑色,然后在释放时返回至白色。 为了我的一生,我在这里找不到我要去的地方。 该代码在Eclipse中可以正常编译且没有警告/错误,并为我提供了一个空白的白色窗口。 我敢肯定,这
4回复

当鼠标悬停在JavaFX中的按钮上方时,如何创建节点(圆)?

我有一个FXML文件,以及一个CSS文件和一个Controller.java文件。 当鼠标悬停在FXML文件的按钮上时, 例如fx:id="load" 如何在舞台上创建一个Circle节点? 我目前正在这样做: 注意:FXML和Controller链接在一起,并考虑了所
1回复

创建Javafx形状的二维数组时遇到问题,因为无法分配值

香港专业教育学院一直看了一段时间,却找不到解决方案。 基本上是在Circle[][] board = new Circle[rows][column];下面的代码上Circle[][] board = new Circle[rows][column]; 当我尝试为这些圈子分配任何值时,由于它
1回复

可以使用JavaFX在GridPane中拖动形状

我是否认为无法在GridPane中拖动Shapes是否正确? 以下是一些代码的链接,该代码允许用户在屏幕上拖动形状: 拖放形状 我希望我的形状具有与上述相同的行为,但是我希望它们在GridPane中(最终,我希望它们的移动被锁定在X或Y轴上,以移动到相邻的形状上)。 我将以下代码添
2回复

JavaFX将可调整大小的弧居中于边框中

我有个问题。 我正在创建一个应用程序,其中的弧长会发生变化,并且我希望该弧在边框窗格内,但是当我更改弧的长度时,它会居中,因此它看起来不像是一个被填充的圆。 实际上,我需要的是一条弧线,并通过其最大长度(360)计算其位置(边界窗格的中心)。 有人可以帮我解决这个问题吗? 非常感谢你。
1回复

Javafx:如何使用源文件的驱动程序文件来显示创建的形状

我正在尝试了解针对我正在处理的某个问题提供的驱动程序文件。 我刚开始学习javafx,我试图在驱动程序文件中创建一个形状,但是初始化、鼠标事件等的额外代码在源文件中。 我创建了一个函数,该函数返回矩形的初始化 X 和我的驱动程序文件中的 system.out.println,因此我知道它们已连接。
1回复

在JavaFX中的矩形边框中绘制圆

我想在onMouseMoved事件中的矩形边框中添加一些圆。 需要使用JavaFX开发图形,这些圆将用于将边连接到图形节点。 见下图: 我正在使用JavaFX。 看到你的代码: 我能怎么做? 谢谢!