将 awt/Cursor 转换为 JavaFX scene/Cursor?

Convert awt/Cursor to JavaFX scene/Cursor?

我的应用程序结合了 Swing 和 JavaFX。我希望所有组件都使用相同的光标。

从 AWT 游标创建 JavaFX 游标的最佳方法是什么?

编辑:有一个名为 javafx.embed.swing.SwingCursors 的实用程序包,不幸的是它不是 public。但也许我可以从中窃取代码。

混合使用 Swing 和 JavaFX 的棘手之处在于它们各自需要在一个特定的线程中执行。除此之外,为每个工具包制作游标非常简单。

获取标准游标:

private java.awt.Cursor awtCursor;
private javafx.scene.Cursor fxCursor;

// ...

    EventQueue.invokeLater(() -> {
        awtCursor = java.awt.Cursor.getPredefinedCursor(
            java.awt.Cursor.CROSSHAIR_CURSOR);
    });

    Platform.runLater(() -> {
        fxCursor = javafx.scene.Cursor.CROSSHAIR;
    });

很容易发现 list of standard AWT cursors() with the list of standard JavaFX cursors.

之间的相似之处

从图像制作自定义光标URL:

private java.awt.Cursor awtCursor;
private javafx.scene.Cursor fxCursor;

// ...

    URL cursorURL = MyApplication.class.getResource("specialcursor.png");

    EventQueue.invokeLater(() -> {
        java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
        awtCursor = toolkit.createCustomCursor(
            toolkit.getImage(cursorURL),
            new java.awt.Point(12, 12),
            "specialcursor");
    });

    Platform.runLater(() -> {
        fxCursor = new ImageCursor(
            new javafx.scene.image.Image(cursorURL.toString()), 12, 12);

    });

对于现有的图像,它非常相似,但你必须注意线程限制。

从现有的 AWT 图像制作自定义光标:

private java.awt.Cursor awtCursor;
private javafx.scene.Cursor fxCursor;

// ...

    EventQueue.invokeLater(() -> {

        java.awt.Image image = /* ... */;

        awtCursor = toolkit.createCustomCursor(
            image,
            new java.awt.Point(12, 12),
            "specialcursor");

        Platform.runLater(() -> {
            fxCursor = new ImageCursor(
                javafx.embed.swing.SwingFXUtils.toFXImage(image, null),
                12, 12);

        });
    });

从现有的 JavaFX 图像制作自定义光标:

private java.awt.Cursor awtCursor;
private javafx.scene.Cursor fxCursor;

// ...
    Platform.runLater(() -> {
        javafx.scene.image.Image image = /* ... */;

        fxCursor = new ImageCursor(image, 12, 12);

        EventQueue.invokeLater(() -> {

            awtCursor = toolkit.createCustomCursor(
                javafx.embed.swing.SwingFXUtils.fromFXImage(image, null),
                new java.awt.Point(12, 12),
                "specialcursor");
        });
    });