为传统的swing应用程序添加触摸手势

dav*_*ell 9 java swing multi-touch javafx-8

我有一个传统的swing应用程序,我需要添加触摸手势,特别是捏缩放,触摸和拖动.

我尝试了JDK 8的SwingNode,我可以在那里运行swing应用程序,但是显示性能降低了50%以上,这是行不通的.MT4J中的SwingTextureRenderer具有相同的问题,甚至没有尝试将触摸事件重新发送为鼠标事件.

我想到了一个玻璃窗格方法,在顶部使用JavaFX层并捕获触摸事件并尝试将它们作为鼠标事件发送到下面的Swing应用程序.

有没有人有替代方法?目标平台是Windows 8.

一旦Stackoverflow打开它,Bounty即将到来.我很快就需要这个.

编辑:

这是我尝试使用SwingNode(鼠标redispatch不起作用).SwingNode的东西可能会分散对最佳解决方案的注意力,所以如果你有更好的想法来触摸它,请忽略它:

@Override
public void start(Stage stage) {
    final SwingNode swingNode = new SwingNode();
    createAndSetSwingContent(swingNode);

    StackPane pane = new StackPane();
    pane.getChildren().add(swingNode);

    stage.setScene(new Scene(pane, 640, 480));
    stage.show();
}

private void createAndSetSwingContent(final SwingNode swingNode) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            UILib.setPlatformLookAndFeel();

            // create GraphViewTouch
            String datafile = null;
            String label = "label";

            final JPanel frame = GraphView.demoFrameless(datafile, label);
            swingNode.setContent(frame);
            swingNode.setOnZoom(new EventHandler<ZoomEvent>() {
                @Override public void handle(ZoomEvent event) {
                    MouseWheelEvent me = new MouseWheelEvent(frame, 1, System.currentTimeMillis(), 0, (int)Math.round(event.getSceneX()), (int)Math.round(event.getSceneY()), (int)Math.round(event.getScreenX()), (int)Math.round(event.getScreenY()), (int)Math.round(event.getZoomFactor()), false, MouseWheelEvent.WHEEL_UNIT_SCROLL, (int)Math.round(event.getZoomFactor()), (int)Math.round(event.getZoomFactor()), event.getZoomFactor());
                    frame.dispatchEvent(me);
                    System.out.println("GraphView: Zoom event" +
                        ", inertia: " + event.isInertia() + 
                        ", direct: " + event.isDirect());

                    event.consume();
                }
            });
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

小智 0

嗯……这很难,但还是有机会的。

我要做的是创建多个MouseListener类(相对于您想要拾取的鼠标事件的数量),然后创建某种系统来检测某些调整,例如。(飞涨)

第一个听众:

    public void mousePressed(MouseEvent e){
    //Set click to true
    clk = true;
    //set first mouse position
    firstPos = window.getMousePosition();
    }

    public void mouseReleased(MouseEvent e){

    //set second mouse position
    secondPos = window.getMousePosition();
    }
Run Code Online (Sandbox Code Playgroud)

第二个听众

    public void mousePressed(MouseEvent e){
    //set clicked to true
    clk = true;
    //set first mouse position (listener 2)
    firstPos = window.getMousePosition();
    }

    public void mouseReleased(MouseEvent e){

    //set second mouse position
    secondPos = window.getMousePosition();
    }
Run Code Online (Sandbox Code Playgroud)

主处理程序

    if(Listener1.get1stMousePos() < Listener1.get2ndMousePos() &&    Listener2.get1stMousePos() < Listener2.get2ndMousePos() && Listener1.clk && Listener2.clk){
    zoomMethod((Listener1.get1stMousePos - Listener1.get2ndMousePos()) +           (Listener1.get1stListener2.get2ndMousePos());

    }
Run Code Online (Sandbox Code Playgroud)

而不仅仅是这样做将其添加到窗口中:

    window.addMouseListener(Listener1);
    window.addMouseListener(Listener2);
Run Code Online (Sandbox Code Playgroud)

希望你能找到办法。