Javafx 鼠标焦点缩放图表

Javafx 鼠标焦点缩放图表,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我有一个自定义图表,我使用以下代码进行缩放: final double SCALE_DELTA = 1.1; treePane.setOnScroll(new EventHandler<ScrollEvent>() { @Override public void handle(ScrollEvent event) { event.consume();

我有一个自定义图表,我使用以下代码进行缩放:

final double SCALE_DELTA = 1.1;
        treePane.setOnScroll(new EventHandler<ScrollEvent>()
        {
            @Override
            public void handle(ScrollEvent event)
            {
                event.consume();

                if (event.getDeltaY() == 0)
                {
                    return;
                }

                double scaleFactor = (event.getDeltaY() > 0) ? SCALE_DELTA : 1 / SCALE_DELTA;

                treePane.setScaleX(treePane.getScaleX() * scaleFactor);
                treePane.setScaleY(treePane.getScaleY() * scaleFactor);
            }
        });
最终双刻度_DELTA=1.1;
setOnScroll(新的EventHandler()
{
@凌驾
公共无效句柄(ScrollEvent事件)
{
event.consume();
if(event.getDeltaY()==0)
{
返回;
}
双尺度因子=(event.getDeltaY()>0)?尺度增量:1/尺度增量;
treePane.setScaleX(treePane.getScaleX()*scaleFactor);
treePane.setScaleY(treePane.getScaleY()*scaleFactor);
}
});
我注意到,当我用鼠标滚轮滚动图表时,我无法缩放鼠标指向的图表。例如,图表被放大到左边或右边,而不是这个


当我用鼠标滚轮缩放图表时,我想缩放光标指向的图表。有什么解决方案吗?

我还没有使用过javafx,但无论如何我都会尝试回答。根据我使用Win32Api/GDI和XNA的经验,您肯定能够读取鼠标坐标。显示的任何内容都显示在坐标x,y处。当您要缩放光标位置时,您将记住以下内容:(假设缩放因子=z,鼠标坐标X和Y为鼠标坐标X和Y为新坐标)重新绘制
您的光标必须指向同一像素,因此,如果图像现在比原来大z倍,那么相对于图片源的鼠标坐标也会变大。对于这些坐标,本质上是距离图像左上角的距离,您必须添加源本身的坐标,相对于窗口的左上角,这些坐标应保持不变。这最终意味着mouseX-X=(mouseX-X)*z,这意味着X=mouseX-(mouseX-X)*z
Y坐标也是如此。从理论上讲,这应该可以很好地工作,我还没有用代码尝试过它,但它在纸上似乎是正确的。您会注意到X和Y看起来越来越小,基本上它们甚至可能变成负片,因为通过缩放鼠标并保持在同一像素上,您可以将左上角向上推/向左拉伸,可能超出屏幕。
不过,您可能会使用滚动条,这与滚动条的替换原理相同。
稍微调整一下变量以使其适合绘图模式,我不知道您正在使用的库是从屏幕(0,0)还是窗口或工作区域开始的,因此您必须使其适应代码的其余部分,但这是它背后的数学/几何体