如何在JavaFX2.2游标上编写自定义文本?

如何在JavaFX2.2游标上编写自定义文本?,java,javafx,cursor,javafx-2,Java,Javafx,Cursor,Javafx 2,我想要一个光标,除了指针本身之外,它还显示鼠标指向的位置的坐标(它应该看起来像一个带有小数字的十字线,在鼠标移动时会发生变化)。如何有效地达到这样的效果?我尝试使用工具提示机制,但是文本远远落后于光标…您可以使用当前坐标创建一个文本对象,将其快照到图像中,然后从该图像和您需要的任何其他光标装饰中创建一个可写图像。然后将可写图像包装在图像光标中: import javafx.application.Application; import javafx.event.EventHandler; imp

我想要一个光标,除了指针本身之外,它还显示鼠标指向的位置的坐标(它应该看起来像一个带有小数字的十字线,在鼠标移动时会发生变化)。如何有效地达到这样的效果?我尝试使用工具提示机制,但是文本远远落后于光标…

您可以使用当前坐标创建一个
文本
对象,将其快照到
图像中,然后从该图像和您需要的任何其他光标装饰中创建一个
可写图像。然后将
可写图像
包装在
图像光标
中:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.ImageCursor;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.WritableImage;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class MouseCoordinateCursor extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pane root = new Pane();

        root.setOnMouseExited(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                root.setCursor(Cursor.DEFAULT);
            }
        });

        root.setOnMouseMoved(new EventHandler<MouseEvent>() {

            final int padding = 9 ;
            final int offset = 6 ;
            @Override
            public void handle(MouseEvent e) {
                Text text = new Text(String.format("[%.1f,%.1f]", e.getX(), e.getY()));
                Image textImage = text.snapshot(null, null);
                int width = (int)textImage.getWidth();
                int height = (int)textImage.getHeight();
                WritableImage cursorImage = new WritableImage(width + offset, height + offset);
                cursorImage.getPixelWriter().setPixels(offset, offset, width, height, textImage.getPixelReader(), 0, 0);
                for (int i = 0; i < padding; i++) {
                    cursorImage.getPixelWriter().setColor(i, padding/2, Color.BLACK);
                    cursorImage.getPixelWriter().setColor(padding/2, i, Color.BLACK);
                }
                root.setCursor(new ImageCursor(cursorImage));
            }
        });

        primaryStage.setScene(new Scene(root, 600, 600));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.Cursor;
导入javafx.scene.ImageCursor;
导入javafx.scene.scene;
导入javafx.scene.image.image;
导入javafx.scene.image.WritableImage;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.text.text;
导入javafx.stage.stage;
公共类鼠标坐标游标扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
窗格根=新窗格();
setOnMouseExited(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
setCursor(Cursor.DEFAULT);
}
});
setOnMouseMoved(新的EventHandler(){
最终整数填充=9;
最终整数偏移=6;
@凌驾
公共无效句柄(MouseEvent e){
Text Text=新文本(String.format(“[%.1f,%.1f]”),e.getX(),e.getY());
Image textImage=text.snapshot(null,null);
int width=(int)textImage.getWidth();
int height=(int)textImage.getHeight();
WritableImage cursorImage=新的WritableImage(宽度+偏移,高度+偏移);
cursorImage.getPixelWriter().setPixels(偏移量、偏移量、宽度、高度、textImage.getPixelReader()、0、0);
for(int i=0;i
你可以贴上标签,每次鼠标坐标发生变化时,都会更改鼠标移动事件中的文本。

这就是我采用的解决方案,但文本是滞后的-相对于光标,它并不总是处于相同的位置。嗯,是的,明白你的意思了。试着这样做。正如我在下面评论的那样-标签将滞后,并且相对于光标不在同一位置。