Как настроить всплывающую сцену мышью прозрачной в javafx - PullRequest
0 голосов
/ 15 января 2020

Как это сделать в JavaFX? Всплывающее окно появляется, когда мышь входит в узел. Когда мышь входит во всплывающее окно с показом, оно скрывает мышь от узла. Затем узел события пожарного выхода. Как заставить всплывающее окно игнорировать события мыши?

code

package sample;

import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();
        primaryStage.setScene(new Scene(root, 300, 275));

        Label labelNode = new Label("Label Node");
        labelNode.setPrefHeight(200);
        labelNode.styleProperty().set("-fx-background-color: orange");
        Popup popup = new Popup();
        popup.getScene().getRoot().setMouseTransparent(true);
        AnchorPane popContent =new AnchorPane();
        popContent.styleProperty().set("-fx-background-color: red");
        popContent.setPrefHeight(100);
        popContent.getChildren().add(new Label("Popup content"));
        popup.getContent().add(popContent);
        labelNode.setOnMouseEntered(event->{
            Point3D point3D = labelNode.localToScene(event.getX(), event.getY(), 0);
            popup.show(primaryStage, point3D.getX()-5, point3D.getY()-5);
        });

        labelNode.setOnMouseExited(event->{
            popup.hide();
        });
        root.getChildren().add(labelNode);

        primaryStage.show();
    }


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

Пожалуйста, попробуйте несколько раз переместить курсор на «желтый».

1 Ответ

0 голосов
/ 16 января 2020

Решение: сохранить два логических состояния nodeExited и popupExited. Скрыть всплывающее окно, когда оба значения верны.

package sample;

import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;


public class Main extends Application {
    boolean nodeExited = false;
    boolean popupExited = false;

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();
        primaryStage.setScene(new Scene(root, 300, 275));


        Label labelNode = new Label("Label Node");
        labelNode.setPrefHeight(200);
        labelNode.styleProperty().set("-fx-background-color: orange");
        Popup popup = new Popup();
        popup.getScene().getRoot().setMouseTransparent(true);
        AnchorPane popContent = new AnchorPane();
        popContent.styleProperty().set("-fx-background-color: red");
        popContent.setPrefHeight(100);
        popContent.getChildren().add(new Label("Popup content"));
        popup.getContent().add(popContent);

        popup.getScene().setOnMouseEntered(event -> {
            popupExited = false;
        });

        popup.getScene().setOnMouseExited(event -> {
            popupExited = true;
            if (nodeExited)
                popup.hide();
        });

        labelNode.setOnMouseEntered(event -> {
            nodeExited = false;
            Point3D point3D = labelNode.localToScene(event.getX(), event.getY(), 0);
            popup.show(primaryStage, point3D.getX() - 5, point3D.getY() - 5);
        });

        labelNode.setOnMouseExited(event -> {
            nodeExited = true;
            if (popupExited)
                popup.hide();
        });
        root.getChildren().add(labelNode);

        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...