将鼠标悬停在背景

时间:2017-09-19 09:38:10

标签: javafx javafx-8

我添加了一个默认光标:

someScene.setCursor(getSomeCursor());

这很有效。我在我的应用程序中随处可见这个游标代码,它看起来很好。但每当我将鼠标悬停在后台GUI组件上时,即使该背景组件(无论是VBox,Canvas还是其他)使用正确的光标本身,光标也会恢复到系统光标,而不是我的自定义光标。

任何帮助表示感谢。

这是一个完整的工作示例,它确切地产生了问题:http链接到那个"蓝色光标"在发布时是活的。但请检查您是否遇到问题。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.ImageCursor;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class CursorTest extends Application {

    @Override
    public void start(Stage stage) {

        SomeDialog someDialog = new SomeDialog(stage);
        GridPane root = new GridPane();

        HBox buttonHolder= new HBox();
        buttonHolder.setPrefSize(300,300);

        Scene theScene = new Scene(root);

        Canvas canvas = new Canvas();
        canvas.setWidth(300);
        canvas.setHeight(300);
        canvas.getGraphicsContext2D().setFill(Color.RED);
        canvas.getGraphicsContext2D().fillRoundRect(100, 100, 100, 100, 10, 10);

        Image cursorImg = new Image("http://www.pngmart.com/files/3/Cursor-Arrow-PNG-Transparent-Image.png");
        ImageCursor imageCursor = new ImageCursor(cursorImg);
        theScene.setCursor(imageCursor);
        stage.setTitle("Ribbon dialog");
        stage.setScene(theScene);
        VBox vBox = new VBox();
        vBox.getChildren().add(canvas);
        vBox.setSpacing(50);

        Button button = new Button("Show modal");
        button.setPadding(new Insets(30,30,30,30));
        button.setOnMouseClicked(event -> {
            someDialog.showMeAndWait();
        });
        buttonHolder.getChildren().add(button);

        root.getChildren().addAll(vBox, buttonHolder);
        stage.show();
    }

    class SomeDialog {

        Stage newStage;

        public SomeDialog(Stage primaryStage) {
            newStage = new Stage();
            GridPane gridPane = new GridPane();
            Scene theScene = new Scene(gridPane);

            Image cursorImg = new Image("http://www.pngmart.com/files/3/Cursor-Arrow-PNG-Transparent-Image.png");
            ImageCursor imageCursor2 = new ImageCursor(cursorImg);
            theScene.setCursor(imageCursor2);
            theScene.setCursor(imageCursor2);
            theScene.setFill(Color.TRANSPARENT);

            newStage.initOwner(primaryStage);
            newStage.initModality(Modality.APPLICATION_MODAL);
            newStage.setTitle("Player inventory");
            newStage.setScene(theScene);
            newStage.initStyle(StageStyle.TRANSPARENT);

            VBox vBox = new VBox();
            Button someBtn = new Button("Close");
            someBtn.setPadding(new Insets(100,100,100,100));
            someBtn.setOnMouseClicked(event -> newStage.close());
            vBox.getChildren().add(someBtn);
            gridPane.getChildren().add(vBox);
        }

        public void showMeAndWait() {
            newStage.showAndWait();
        }
    }
}

0 个答案:

没有答案