我有一个遗留的Swing应用程序,需要添加触摸手势,特别是捏合缩放和触摸拖拽。
我尝试了JDK 8的SwingNode,可以在那里运行Swing应用程序,但显示性能降低了50%以上,这不可行。 MT4J中的SwingTextureRenderer也存在同样的问题,而且甚至没有尝试将触摸事件转发为鼠标事件。
我考虑使用JavaFX层的玻璃板方法,在顶部捕获触摸事件,并尝试将其作为鼠标事件分派到下面的Swing应用程序。
是否有其他替代方法?目标平台是Windows 8。
Stackoverflow开启奖励后,我将提供悬赏。 我需要尽快解决这个问题。
编辑:
这是我使用SwingNode尝试过的内容(鼠标重派无效)。 如果您有更好的主意以将触摸引入Swing,则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();
}
});
}
});
}