将 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");
});
});
我的应用程序结合了 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");
});
});