我有一个JavaFX应用程序,我在画布上画画。绘图跟随鼠标。此移动有点滞后,因为渲染需要一些时间。到目前为止还可以。但当我停止鼠标时,它的坐标有时仍处于旧位置。
以下代码再现了该问题:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.EllipseBuilder;
import javafx.stage.Stage;
public class TestApp extends Application
{
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception
{
Pane p = new Pane();
final Ellipse ellipse = EllipseBuilder.create().radiusX(10).radiusY(10).fill(Color.RED).build();
p.getChildren().add(ellipse);
p.setOnMouseMoved(event ->
{
ellipse.setCenterX(event.getX());
ellipse.setCenterY(event.getY());
Platform.runLater(() -> doSomeWork());
});
Scene scene = SceneBuilder.create().root(p).width(1024d).height(768d).build();
primaryStage.setScene(scene);
primaryStage.show();
}
void doSomeWork()
{
try
{
Thread.sleep(100);
}
catch (Exception ignore) { }
}
}
当您快速移动鼠标并突然停止时,圆圈有时不在鼠标下方。
我玩过使用或不使用平台。runLater()或调用顺序。没有成功。
编辑:我无法在Windows下重现这种行为。
我的假设是在UI线程和平台上调用onMouseMoved。稍后运行。这会阻塞UI线程,因此,最后的onMouseMoved调用将被丢弃(这使圆圈位于onMouseMoved最后一次调用的位置)。如平台中所定义。runLater文档:
此外,在可能的情况下,长时间运行的操作应该在后台线程上完成,从而为GUI操作释放JavaFX应用程序线程。
所以试着在一个额外的线程上完成你的工作,并在计算完成后通过run延迟
将它发布到UI:
public class TestApp extends Application
{
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception
{
Pane p = new Pane();
final Ellipse ellipse = EllipseBuilder.create().radiusX(10).radiusY(10).fill(Color.RED).build();
p.getChildren().add(ellipse);
p.setOnMouseMoved(event ->
{
ellipse.setCenterX(event.getX());
ellipse.setCenterY(event.getY());
doSomeWork();
});
Scene scene = SceneBuilder.create().root(p).width(1024d).height(768d).build();
primaryStage.setScene(scene);
primaryStage.show();
}
void doSomeWork()
{
new Thread(){
public void run(){
try
{
Thread.sleep(100);
Platform.runLater(() -> {
// ui updates
});
}
catch (Exception ignore) { }
}
}.start();
}
}
我正在尝试创建一个程序,该程序应该基于两次鼠标左键单击在画布上绘制一个矩形,并通过一次右键单击清除画布。 创建矩形的方式应该是,第一次鼠标点击模拟矩形的一个角,下一次鼠标点击与第一次鼠标点击相比模拟矩形的对角线角。 我被困在如何存储第一次鼠标点击的坐标,然后把第二次鼠标点击用好,因为每个定义的矩形只基于一组坐标创建,这是矩形的左上角。 现在,我的代码所做的只是绘制固定大小的矩形(50x25),这显
有什么想法吗?提前谢了。
问题内容: 我只想在鼠标单击后绘制圆圈。由于paintComponent方法调用了自身,因此首先绘制圆而无需单击。 问题答案: 您的代码存在一些问题: 你永远不会打电话 你只需要一个和 请注意,当您调整框架大小时,某些圆圈将消失,并且总体上以奇怪的方式表现。 我会将所有s 存储在用户单击的位置,然后在方法内部遍历该列表。这样您就可以通话,而圈子不会消失。 更改后的工作代码:
我目前有以下的类: 老实说,代码并不重要,请相信我,当用户将鼠标悬停在我的< code>Item对象上时,它会显示一个弹出窗口,如下所示: 这个弹出窗口在我的屏幕中间打开。如果我移动窗口,弹出窗口将在同一位置打开。我需要我的弹出窗口以某种方式在鼠标指针下打开。我知道具有此功能(据称),但我已经致力于设计这个,它具有我的许多设计目标。 这有可能让显示在某个位置吗? 谢谢。
所以我有这个anchorpane,我希望为第二个鼠标键添加一个鼠标listner。我尝试了以下方法,但我一直得到一个错误,有人知道问题是什么吗? 为了记录在案,我也尝试过这样做: 绑定不匹配:MouseButton类型不能有效替代EventHandler类型的有界参数
问题内容: 我需要在滚动窗格上相对于鼠标位置放大/缩小。 我目前通过将内容包装在一个组中并缩放组本身来实现缩放功能。我用自定义枢轴创建一个新的Scale对象。(枢轴设置为鼠标位置) 这在Group的初始比例为1.0的情况下非常适用,但是之后的缩放比例无法沿正确的方向缩放-我相信这是因为Group缩放后相对鼠标位置会发生变化。 我的代码: 如何在不同的缩放级别上获得正确的鼠标位置?有没有一种更简单的