จะสร้างตำแหน่งวงกลมสุ่มเมื่อกดปุ่มใน JavaFX ได้อย่างไร

ฉันกำลังพยายามเรียนรู้ Java จากหลักสูตร Udemy และถูกขอให้สร้างงานก่อนที่จะย้ายไปยังส่วนต่อไปนี้

งานที่ได้รับมอบหมายคือการเขียนแอปพลิเคชัน 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();
    }

person Rose    schedule 18.09.2019    source แหล่งที่มา
comment
ดู Math#random() หรือ java.util.Random. แบบแรกจะส่งกลับค่าในช่วง [0.0,1.0) ซึ่งคุณสามารถคูณด้วยความกว้าง/ความสูงของพาเรนต์ของวงกลมเพื่อให้ได้จุดศูนย์กลางใหม่ x/y หลังมีเมธอดที่สามารถส่งคืนขอบเขต ints (ในช่วง [0,bound))   -  person Slaw    schedule 19.09.2019
comment
คุณช่วยตรวจสอบคำถามที่อัปเดตของฉันได้ไหม ฉันทำตามที่คุณแนะนำแล้ว และฉันส่งค่าที่ส่งคืนจากการสุ่มไปยัง setTranslateX/Y....... ยังคงไม่เคลื่อนไหว :/   -  person Rose    schedule 19.09.2019


คำตอบ (1)


ลองด้วยตัวเองก่อน แต่ฉันจะโพสต์วิธีแก้ปัญหาเพื่อให้คุณเห็นว่ามันทำอย่างไรในกรณีที่คุณติดขัด

  1. สร้าง สุ่ม ใน วิธีการเริ่มต้นแอปพลิเคชัน
  2. เมื่อคุณเพิ่มจำนวนคลิก รับ ints สองสามอันโดยใช้ random.nextInt(bound) จากการสุ่ม
  3. ตั้งค่าวงกลม centerX และ centerY เป็นค่าสุ่มของคุณ
  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);
    }
}
person jewelsea    schedule 19.09.2019
comment
OMG ฉันกำลังดำเนินการเพื่อแนะนำความคิดเห็นของคุณและไม่ทราบว่าคุณมีคำตอบใหม่ ใช่นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณเพื่อน ตอนนี้ฉันจะเล่นกับมันเพื่อดูว่ามันทำงานอย่างไร - person Rose; 19.09.2019