Как создать случайные местоположения круга при нажатии кнопки в JavaFX? - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь выучить 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);
    }

}

ОБНОВЛЕНИЕ: Я решил объявить мою переменную 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 Ответ

3 голосов
/ 19 сентября 2019

Сначала попробуйте сами, но я опубликую решение, чтобы вы могли увидеть, как это делается, на случай, если вы застряли.

  1. Создайте random вваш метод инициализации приложения
  2. Если вы увеличите количество кликов, получите пару значений, используя random.nextInt(bound) из случайного числа.
  3. Установить кругcenterX и centerY к вашим случайным значениям.
  4. Готово.

Хорошо, не совсем сделано, проблема, которую вы обнаружите, когда попробуете это (что вам следует сделать), состоит в том, что она не будет работать, кажется, что круг не будет центрироваться на х иу значений вы установили.Это связано с тем, что круг находится на панели макета (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);
    }
}
...