将awt / Cursor转换为JavaFX场景/ Cursor?

问题描述 投票:3回答:1

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

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

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

java swing javafx caret
1个回答
3
投票

关于将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()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");
        });
    });
© www.soinside.com 2019 - 2024. All rights reserved.