2014-02-06 15 views
8

Ich habe eine Legacy-Swing-Anwendung, die ich Touch Gesten hinzufügen muss, speziell zu Zoomen zu zerren und berühren und ziehen.Hinzufügen von Touch-Gesten zu Legacy Swing-Anwendung

Ich habe versucht den SwingNode von JDK 8 und ich kann die Swing-Anwendung dort ausführen, aber die Display-Leistung wurde um mehr als 50% gekürzt, die nicht funktionieren wird. SwingTextureRenderer in MT4J hat das gleiche Problem, und das ohne Touch-Ereignisse als Mausereignisse neu zu versenden.

Ich dachte über eine Glasscheibe Ansatz mit einer JavaFX-Schicht oben und Erfassung der Berührungsereignisse und versuchen, sie als Mausereignisse an die Swing-App darunter zu versenden.

Hat jemand einen alternativen Ansatz? Die Zielplattform ist Windows 8.

Bounty kommt, sobald Stackoverflow es öffnet. Ich brauche das ziemlich schnell.

EDIT:

Hier ist, was ich mit SwingNode versucht (die Maus redispatch hat nicht funktioniert). Die SwingNode Sachen könnte sein, eine Ablenkung von der besten Lösung dieses so ignorieren, wenn Sie eine bessere Idee touch in Schwung für immer:

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

Bitte geben Sie Code für eine [minimale Probe] (http://stackoverflow.com/help/mcve), die die Leistungsreduzierung mit SwingNode demonstriert. – jewelsea

+1

Ich habe die Frage mit meinem SwingNode-Versuch aktualisiert – davidethell

+1

@jewelsea schlug vor, ein [MCTaRE] (http://stackoverflow.com/help/mcve) (Minimal Complete Getestetes und lesbares Beispiel) zu liefern. Bitte folgen Sie dem Link und lesen Sie es. Es sind keine "nicht kompilierbaren Code-Snippets" und es kann sehr nützlich sein, einen vorzubereiten. –

Antwort

0

hmm ... das ist eine schwierige Frage, aber es gibt eine Chance.

Was ich tun würde, ist mehrere MouseListener Klassen (bezogen auf die Anzahl der Mausereignisse Sie wollen abholen) machen, und als eine Art von System schafft bestimmte Anpassungen zu erkennen, z. B. (Zoom)

1. Hörer:

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

zweiten Listener

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

Haupthandler

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

    } 

A nd als nur tun Sie dies, um es in das Fenster hinzuzufügen:

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

Hoffe, Sie finden einen Weg.

0

Für die Pinch-to-Zoom:

die GestureMagnificationListener Versuchen von guigarage.com. Es stellt eine Methode:

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