我们如何才能仅沿着曲线而不是在包含的区域中显示曲线(使用 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 为空并且您只有曲线的轮廓,则工具提示应该按照您的描述工作。但是,如果对象是不透明的,则只会拾取顶部对象。您可以按照适合您的场景的方式实现工具提示机制。例如,如果您位于多个相互遮挡的对象上方,则可以显示这些对象的组合工具提示。
在下面的示例代码中 (从 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 为空并且您只有曲线的轮廓,则工具提示应该按照您的描述工作。但是,如果对象是不透明的,则只会拾取顶部对象。您可以按照适合您的场景的方式实现工具提示机制。例如,如果您位于多个相互遮挡的对象上方,则可以显示这些对象的组合工具提示。