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();
}
});
}
});
}
Bitte geben Sie Code für eine [minimale Probe] (http://stackoverflow.com/help/mcve), die die Leistungsreduzierung mit SwingNode demonstriert. – jewelsea
Ich habe die Frage mit meinem SwingNode-Versuch aktualisiert – davidethell
@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. –