Настройка анимации для движения назад и показа фигуры из класса при нажатии кнопки - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю над javafx-программой, чтобы создать три кнопки: «круг», «эллипс» и «реверс». Кнопка с кружком - это первое, что показывается при запуске программы, предполагается, что кнопка реверса соответствует движению прямоугольника по кругу. У меня возникают проблемы с работой кнопки реверса, я установил для autoReverse значение true, но ничего не происходит. Вторая проблема с кодом заключается в том, что при нажатии кнопки эллипса класс MyEllipse не отображает форму эллипса, как это должно быть, и не удаляет анимацию круга с панели. Я попытался создать новую панель в EventHandler для buttonellipse, но я предполагаю, что это неправильный способ сделать это. Любая помощь по этим двум вопросам будет принята с благодарностью.

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.animation.PathTransition;
import javafx.scene.paint.Color;
import javafx.animation.Timeline;
import javafx.scene.shape.Circle;
import javafx.util.Duration;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Ellipse;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
import javafx.scene.layout.HBox;
import javafx.event.EventHandler;
import javafx.stage.Stage;
public class exam3b extends Application {
  @Override 
  public void start(Stage primaryStage) {      
Rectangle rectangle = new Rectangle (0, 0, 25, 50);
rectangle.setFill(Color.ORANGE);

Circle circle = new Circle(115, 90, 45);
circle.setFill(Color.WHITE);
circle.setStroke(Color.BLACK);

PathTransition pt = new PathTransition();
pt.setDuration(Duration.millis(4000));
pt.setPath(circle);
pt.setNode(rectangle);
pt.setOrientation(
PathTransition.OrientationType.ORTHOGONAL_TO_TANGENT);
pt.setCycleCount(Timeline.INDEFINITE);
pt.setAutoReverse(false);
pt.play();

circle.setOnMousePressed(e -> pt.pause());
circle.setOnMouseReleased(e -> pt.play());

HBox panel = new HBox(10);
panel.setAlignment(Pos.BOTTOM_CENTER);
Button button = new Button("Circle");
Button buttonellipse = new Button("Ellipse");
Button reverse = new Button("Reverse");
panel.getChildren().addAll(button,buttonellipse,reverse);

button.setOnAction(new EventHandler<ActionEvent>()
{
    @Override
    public void handle(ActionEvent e)
    {
        reverse.setVisible(true);
    }
});

reverse.setOnAction(new EventHandler<ActionEvent>() //supposed to make rectangle move in reverse direction
{
    @Override
    public void handle(ActionEvent e)
    {
        pt.setAutoReverse(true);
    }
});

buttonellipse.setOnAction(new EventHandler<ActionEvent>() //button to make ellipse appear from class MyEllipse, reverse button is supposed to disappear
{
    @Override
    public void handle(ActionEvent e)
    {
        reverse.setVisible(false);
        Pane ellipse = new Pane();
        ellipse.getChildren().add(new MyEllipse());
    }
});

Pane pane = new Pane();
pane.getChildren().addAll(panel,circle,rectangle);

Scene scene = new Scene(pane, 350, 250);
primaryStage.setTitle("exam3b"); 
primaryStage.setScene(scene); 
primaryStage.show(); 
  }

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

 class MyEllipse extends Pane 
{
  private void paint() {
getChildren().clear();
for (int i = 0; i < 16; i++) {
  Ellipse e1 = new Ellipse(getWidth() / 2, getHeight() / 2, 
    getWidth() / 2 - 50, getHeight() / 2 - 50);
  e1.setStroke(Color.color(Math.random(), Math.random(),
    Math.random()));
  e1.setFill(Color.WHITE);
  e1.setRotate(i * 180 / 16);
  getChildren().add(e1);
    }
  }

  @Override
  public void setWidth(double width) {
super.setWidth(width);
paint();
  }

  @Override
  public void setHeight(double height) {
super.setHeight(height);
paint();
  }
} 

1 Ответ

0 голосов
/ 28 апреля 2018

У вас была проблема с тем, как вы использовали MyEllipse, в том, что вы никогда не добавляли его в корневую панель и не устанавливали ширину / высоту (что приводит к вызову метода рисования). Я переименовал вашу корневую панель в «root». Создан экземпляр «MyEllipse», и в кнопку «Эллипс» я добавляю экземпляр «MyEllipse» в корневую панель.

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.animation.PathTransition;
import javafx.scene.paint.Color;
import javafx.animation.Timeline;
import javafx.scene.shape.Circle;
import javafx.util.Duration;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Ellipse;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
import javafx.scene.layout.HBox;
import javafx.event.EventHandler;
import javafx.stage.Stage;

public class exam3b extends Application {

    @Override
    public void start(Stage primaryStage) {
        Rectangle rectangle = new Rectangle(0, 0, 25, 50);
        rectangle.setFill(Color.ORANGE);

        Circle circle = new Circle(115, 90, 45);
        circle.setFill(Color.WHITE);
        circle.setStroke(Color.BLACK);

        PathTransition pt = new PathTransition();
        pt.setDuration(Duration.millis(4000));
        pt.setPath(circle);
        pt.setNode(rectangle);
        pt.setOrientation(
                PathTransition.OrientationType.ORTHOGONAL_TO_TANGENT);
        pt.setCycleCount(Timeline.INDEFINITE);
        pt.setAutoReverse(true);
        pt.play();

        circle.setOnMousePressed(e -> pt.pause());
        circle.setOnMouseReleased(e -> pt.play());

        HBox panel = new HBox(10);
        panel.setAlignment(Pos.BOTTOM_CENTER);
        Button button = new Button("Circle");
        Button buttonellipse = new Button("Ellipse");
        Button reverse = new Button("Reverse");
        panel.getChildren().addAll(button, buttonellipse, reverse);

        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                reverse.setVisible(true);
            }
        });

        reverse.setOnAction(new EventHandler<ActionEvent>() //supposed to make rectangle move in reverse direction
        {
            @Override
            public void handle(ActionEvent e) {
                pt.setAutoReverse(true);
            }
        });

        Pane root = new Pane();
        MyEllipse myEllipse = new MyEllipse();
        myEllipse.setWidth(200);
        myEllipse.setHeight(400);
        buttonellipse.setOnAction(new EventHandler<ActionEvent>() //button to make ellipse appear from class MyEllipse, reverse button is supposed to disappear
        {
            @Override
            public void handle(ActionEvent e) {
//                reverse.setVisible(false);
                if (root.getChildren().contains(myEllipse)) {
                    root.getChildren().remove(myEllipse);
                } else {
                    System.out.println("adding ellipse");
                    root.getChildren().add(myEllipse);
                }
            }
        });

        root.getChildren().addAll(panel, circle, rectangle);

        Scene scene = new Scene(root, 350, 250);
        primaryStage.setTitle("exam3b");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

class MyEllipse extends Pane {


    public MyEllipse() {
    }

    private void paint() {
        getChildren().clear();
        for (int i = 0; i < 16; i++) {
            Ellipse e1 = new Ellipse(getWidth() / 2, getHeight() / 2,
                    getWidth() / 2 - 50, getHeight() / 2 - 50);
            e1.setStroke(Color.color(Math.random(), Math.random(),
                    Math.random()));
            e1.setFill(Color.WHITE);
            e1.setStrokeWidth(1);
            e1.setRotate(i * 180 / 16);
            getChildren().add(e1);
        }
    }

    @Override
    public void setWidth(double width) {
        super.setWidth(width);
        paint();
    }

    @Override
    public void setHeight(double height) {
        super.setHeight(height);
        paint();
    }
}
...