PDragSequenceEventHandler
简化了基于鼠标拖动事件的处理程序的实现。在您的情况下,您可以从PBasicInputEventHandler
. 此外,您可以根据需要添加任意数量的事件侦听器,只要确保它们不会相互干扰。在添加用户交互中阅读有关事件侦听器的更多信息。
下面是一个缩放处理程序的示例,它对鼠标滚轮旋转做出反应(不确定您想如何在基于双击的缩放中取消缩放,所以我使用了鼠标滚轮)。该示例保留了基于拖动的原始缩放处理程序,并基于鼠标滚轮添加了一个新缩放处理程序。如果需要,您还可以使用removeInputEventListener
方法删除原始缩放处理程序。
import java.awt.Dimension;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import edu.umd.cs.piccolo.PCanvas;
import edu.umd.cs.piccolo.PLayer;
import edu.umd.cs.piccolo.event.PBasicInputEventHandler;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.nodes.PPath;
public class TestZoom {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("TestZoom");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
final PCanvas canvas = new PCanvas() {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
};
PLayer layer = new PLayer();
canvas.getCamera().addLayer(0, layer);
canvas.getCamera().getRoot().addChild(layer);
final PPath node = PPath.createRectangle(100, 100, 100, 100);
canvas.getLayer().addChild(node);
canvas.addInputEventListener(new MouseZoomHandler());
frame.add(canvas);
frame.pack();
frame.setVisible(true);
}
});
}
public static class MouseZoomHandler extends PBasicInputEventHandler {
@Override
public void mouseWheelRotated(final PInputEvent event) {
final double scale = 1 - 0.2 * event.getWheelRotation();
final Point2D point = event.getPosition();
event.getCamera().scaleViewAboutPoint(scale,
point.getX(), point.getY());
}
}
}