Конвертировать awt / Курсор в сцену JavaFX / Курсор? - PullRequest
3 голосов
/ 01 апреля 2020

Мое приложение сочетает в себе Swing и JavaFX. Мне бы хотелось, чтобы все компоненты использовали один и тот же курсор.

Каков наилучший способ создания курсора JavaFX из курсора AWT?

РЕДАКТИРОВАТЬ: существует пакет утилит с именем javafx.embed.swing.SwingCursors К сожалению, это не опубликовано c. Но, возможно, я смогу украсть у него код.

1 Ответ

3 голосов
/ 05 апреля 2020

Хитрость в смешивании 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;
    });

Найти список между списком стандартных курсоров AWT легко ( ) со списком стандартных курсоров JavaFX .

Создание пользовательского курсора из 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");
        });
    });
...