JavaFX: доставлять события мыши на скрытые узлы тоже

Выполняя иначе простой метод «thunk», async создает в памяти состояние async state machine, а не async - нет. Хотя это часто может указывать на использование версии non-async, поскольку она более эффективна (это правда), это также означает, что в случае зависания у вас нет доказательств того, что этот метод задействован в «стеке возврата / продолжения», что иногда затрудняет понимание повесы.

Итак, да, когда perf не критичен (и обычно это не так), я брошу async на все эти методы thunk, чтобы у меня была машина состояния async, чтобы помочь мне диагностировать зависания позже, и также, чтобы гарантировать, что, если эти методы thunk когда-либо будут развиваться со временем, они обязательно вернут сбитые задачи вместо throw.

2
задан fastryan 5 March 2019 в 19:23
поделиться

1 ответ

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

import java.util.Random;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.EventType;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication349 extends Application
{

    private final Random RND = new Random();
    Circle bottomCircle = new Circle(150, 150, 100, Color.BLUE);
    Circle topCircle = new Circle(200, 100, 40, randColor());

    MouseEvent enteredBottomCircle = new MouseEvent(MouseEvent.MOUSE_ENTERED, bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), MouseButton.NONE, 1, true, true, true, true, true, true, true, true, true, true, null);
    MouseEvent exitedBottomCircle = new MouseEvent(MouseEvent.MOUSE_EXITED, bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), MouseButton.NONE, 1, true, true, true, true, true, true, true, true, true, true, null);

    @Override
    public void start(Stage stage) throws Exception
    {

        bottomCircle.fillProperty().bind(Bindings.when(bottomCircle.hoverProperty()).then(Color.AQUA).otherwise((Color.BLUE)));

        topCircle.addEventHandler(EventType.ROOT, (event) -> {
            System.out.println(event.getEventType());

            if (event.getEventType() == MouseEvent.MOUSE_ENTERED || event.getEventType() == MouseEvent.MOUSE_MOVED || event.getEventType() == MouseEvent.MOUSE_EXITED) {
                MouseEvent event1 = (MouseEvent) event;

                if (Math.sqrt(Math.pow((event1.getSceneX() - bottomCircle.getCenterX()), 2) + Math.pow((event1.getSceneY() - bottomCircle.getCenterY()), 2)) < bottomCircle.getRadius()) {
                    System.out.println("entered bottom circle");
                    bottomCircle.fireEvent(enteredBottomCircle);
                }

                else {
                    System.out.println("exited bottom circle");
                    bottomCircle.fireEvent(exitedBottomCircle);
                }
            }

        });

        topCircle.setOnMouseClicked((event) -> topCircle.setFill(randColor()));

        CheckBox mouseTransparencyCheckBox = new CheckBox("Top Circle Mouse Transparency");
        topCircle.mouseTransparentProperty().bind(mouseTransparencyCheckBox.selectedProperty());

        Pane pane = new Pane();
        pane.setPrefSize(300, 300);
        pane.getChildren().addAll(mouseTransparencyCheckBox, bottomCircle, topCircle);

        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }

    private Color randColor()
    {
        return Color.hsb(RND.nextDouble() * 360, 1, 1, 0.75);
    }

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

}
0
ответ дан Sedrick 5 March 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: