我们如何才能仅沿着曲线而不是在包含的区域中显示曲线(使用 piccolo2d 绘制)的工具提示?

How can we show the tooltip of a curved line (drawn with piccolo2d) only along the curve and not in the contained area?

在下面的示例代码中 (从 https://github.com/piccolo2d/piccolo2d.java/tree/master/examples/src/main/java/org/piccolo2d/examples 修改为 TooltipExample.java), 我在矩形内创建了一条曲线。这条曲线包含的 area/bounds 似乎不是沿着曲线,而是 GREY 中突出显示的部分。我试图找到是否有一种方法可以仅沿曲线显示曲线的工具提示。我尝试重置底层 PBounds,但没有成功。有谁知道如何做到这一点?

import org.piccolo2d.PCamera;
import org.piccolo2d.PCanvas;
import org.piccolo2d.PNode;
import org.piccolo2d.event.PBasicInputEventHandler;
import org.piccolo2d.event.PInputEvent;
import org.piccolo2d.extras.PFrame;
import org.piccolo2d.nodes.PPath;
import org.piccolo2d.nodes.PText;

import java.awt.*;
import java.awt.geom.Point2D;


/**
 * Simple example of one way to add tooltips
 *
 * @author jesse
 */
public class TooltipExample extends PFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public TooltipExample() {
        this(null);
    }

    public TooltipExample(final PCanvas aCanvas) {
        super("TooltipExample", false, aCanvas);
    }

    public void initialize() {
        final PNode n1 = PPath.createEllipse(0, 0, 100, 100);
        final PNode n2 = PPath.createRectangle(300, 200, 100, 100);

        PPath curve = new PPath.Float();
        curve.moveTo(318.0,222.0);
        curve.curveTo(318.0,222.0, 375.0,228.0, 352.0,278.0);
        curve.addAttribute("tooltip","Curve");
        curve.setPaint(Color.GRAY);

        n1.addAttribute("tooltip", "node 1");
        n2.addAttribute("tooltip", "node 2");
        getCanvas().getLayer().addChild(n1);
        getCanvas().getLayer().addChild(n2);
        getCanvas().getLayer().addChild(curve);

        final PCamera camera = getCanvas().getCamera();
        final PText tooltipNode = new PText();

        tooltipNode.setPickable(false);
        camera.addChild(tooltipNode);

        camera.addInputEventListener(new PBasicInputEventHandler() {
            public void mouseMoved(final PInputEvent event) {
                updateToolTip(event);
            }

            public void mouseDragged(final PInputEvent event) {
                updateToolTip(event);
            }

            public void mouseClicked(final PInputEvent event) {
                final Point2D p = event.getCanvasPosition();
                System.out.println(p.getX()+","+p.getY());
            }

            public void updateToolTip(final PInputEvent event) {
                final PNode n = event.getPickedNode();
                final String tooltipString = (String) n.getAttribute("tooltip");
                final Point2D p = event.getCanvasPosition();
                event.getPath().canvasToLocal(p, camera);

                tooltipNode.setText(tooltipString);
                tooltipNode.setOffset(p.getX() + 8, p.getY() - 8);
            }
        });
    }

    public static void main(final String[] argv) {
        new TooltipExample();
    }
}

大图:假设我们有许多这样的重叠曲线相互交错。如果在这些曲线的巨大重叠区域之间放置了另一个较小的形状,我将无法获得该形状的任何事件。基本上我无法点击那个形状。我将不胜感激解决此问题的任何建议。提前致谢。

编辑 1:为问题阐述添加一张新图片:

如果 paint 为空并且您只有曲线的轮廓,则工具提示应该按照您的描述工作。但是,如果对象是不透明的,则只会拾取顶部对象。您可以按照适合您的场景的方式实现工具提示机制。例如,如果您位于多个相互遮挡的对象上方,则可以显示这些对象的组合工具提示。