我想制作一个 JavaFX 应用程序,基本上用一个覆盖整个用户屏幕Canvas
对象,所以基本上我可以在用户屏幕上绘制任何内容。
制作一个覆盖整个屏幕的窗口很简单。通过本教程可以使其基本上透明:https://assylias.wordpress.com/2013/12/08/383/
因此,阻止我的唯一一件事是,显然,窗口尽管是透明的,但它仍然会捕获用户鼠标和按键事件。
有什么方法可以实现这个目标吗?举一个更具体的例子,假设我想要在用户的鼠标光标周围制作一个红色圆圈,无论它走到哪里,但用户输入都不会被中断。
你想要的不可能在plain JavaFX.
你可以看看我的回答here,这是最接近的。但是您无法在整个桌面上覆盖透明画布并将鼠标事件转发到底层窗口。
让 Canvas 半透明可以捕获所有事件,但您可以看到底层窗口。但是,当您的画布完全透明时,您的应用程序将不会捕获任何事件。
然而,你的“具体例子”可以用不同的方式解决。这是代码:
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class CircleAroundCursor extends Application {
double radius = 50;
@Override
public void start(Stage primaryStage) {
Group root = new Group();
Circle circle = new Circle( radius * 2,radius * 2,radius);
circle.setStroke(Color.RED);
circle.setFill(Color.TRANSPARENT);
root.getChildren().add(circle);
Scene scene = new Scene(root, Color.TRANSPARENT);
scene.getRoot().setStyle("-fx-background-color: transparent");
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.setAlwaysOnTop(true);
AnimationTimer loop = new AnimationTimer() {
@Override
public void handle(long now) {
PointerInfo info = MouseInfo.getPointerInfo();
Point p = info.getLocation();
primaryStage.setX(p.getX() - radius * 2);
primaryStage.setY(p.getY() - radius * 2);
}
};
loop.start();
}
public static void main(String[] args) {
launch(args);
}
}
这至少解决了“我想让用户的鼠标光标无论走到哪里都被一个红色圆圈包围,但用户输入不会被中断”
注意:这里 AWT 类与 FX 类混合在一起。您可能需要使用 EDT 和 FX 线程处理。不过,它确实可以工作。
截屏:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)