簡體   English   中英

為傳統的swing應用程序添加觸摸手勢

[英]Add touch gestures to legacy swing application

我有一個傳統的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();
                }
            });
        }
    });
}

嗯......這是一個艱難的,但有機會。

我要做的是制作多個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();
    }

第二個聽眾

    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();
    }

主處理程序

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

    }

而不是只是這樣做將其添加到窗口:

    window.addMouseListener(Listener1);
    window.addMouseListener(Listener2);

希望你找到辦法。

對於捏縮放:

試試guigarage.com的GestureMagnificationListener。 它提供了一種方法:

public void magnify(GestureMagnificationEvent me){...}

您可以使用JNA來解析來自Windows的消息。

有關Microsoft多點觸控事件的一些文檔: https//docs.microsoft.com/en-us/windows/desktop/wintouch/wm-touchdown

有關如何使用Java和示例代碼進行操作的一些文檔: https//github.com/fmsbeekmans/jest/wiki/Native-Multitouch-for-AWT-component-(Windows)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM