Bagaimana cara membuat lokasi lingkaran acak ketika Tombol ditekan di JavaFX?

Saya mencoba belajar Java dari kursus Udemy dan saya diminta membuat tugas sebelum melanjutkan ke bagian berikut.

Tugasnya adalah menulis aplikasi JavaFX yang menampilkan lingkaran dan tombol dan setiap kali tombol tersebut ditekan, lingkaran tersebut harus dipindahkan ke lokasi acak.

Sejauh ini saya telah membuat kode yang menghitung berapa kali saya mengklik tombol, sekarang saya ingin memindahkan lingkaran beserta penghitungannya:

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);
    }

}

PEMBARUAN: Saya memutuskan untuk mendeklarasikan jumlah variabel saya menjadi = Math.random(); dan membuat lingkaran. Setelah itu, mengklik tombol tersebut akan menghasilkan Math.random dan memasukkannya ke dalam setTranslate, bukan?

    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 sumber
comment
Lihat Math#random() atau java.util.Random. Yang pertama mengembalikan nilai dalam rentang [0.0,1.0) yang dapat Anda kalikan dengan lebar/tinggi induk lingkaran untuk mendapatkan pusat x/y yang baru. Yang terakhir memiliki metode yang dapat mengembalikan ints yang dibatasi (dalam kisaran [0,bound)).   -  person Slaw    schedule 19.09.2019
comment
Bisakah Anda memeriksa pertanyaan saya yang diperbarui, saya melakukan seperti yang Anda sarankan dan saya meneruskan nilai yang dikembalikan dari acak ke setTranslateX/Y....... masih tidak bergerak :/ .   -  person Rose    schedule 19.09.2019


Jawaban (1)


Cobalah sendiri terlebih dahulu, tetapi saya akan memposting solusinya sehingga Anda dapat melihat cara melakukannya, jika Anda mengalami kebuntuan.

  1. Buat acak di metode init aplikasi
  2. Di mana Anda meningkatkan jumlah klik, dapatkan beberapa int menggunakan random.nextInt(bound) dari acak.
  3. Atur lingkaran centerX dan centerY ke nilai acak Anda.
  4. Selesai.

Oke, belum selesai, masalah yang akan Anda temukan saat mencobanya (yang seharusnya) adalah tidak berhasil, lingkaran sepertinya tidak berpusat pada nilai x dan y yang Anda tetapkan. Hal ini karena Lingkaran berada di panel tata letak (FlowPane), yang akan mengabaikan pengaturan tata letak manual Anda (meskipun tidak menerjemahkan nilai). Solusinya adalah dengan menempatkan lingkaran di Grup (sebagai item pertama, sehingga berada di bawah semuanya), kemudian letakkan panel aliran di grup, dan di FlowPane Anda memiliki tombol dan penghitung klik.

Anda mungkin ingin mencadangkan TranslateX/Y untuk animasi bukan untuk tata letak, meskipun ini dapat digunakan untuk memindahkan bentuk dan juga boleh digunakan karena alasan itu.

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, saya sedang mengerjakannya dengan membimbing saya dalam komentar Anda dan tidak menyadari Anda punya jawaban baru. Ya, ini yang saya cari, terima kasih kawan. Sekarang saya akan memainkannya untuk melihat cara kerjanya. - person Rose; 19.09.2019