我有一个遗留的 Swing 应用程序,我需要向其添加触摸手势,特别是捏合缩放以及触摸和拖动。
我尝试了JDK 8的SwingNode,我可以在那里运行swing应用程序,但是显示性能降低了50%以上,无法正常工作。 MT4J 中的 SwingTextureRenderer 有同样的问题,甚至没有尝试将触摸事件重新分配为鼠标事件。
我想到了一种玻璃面板方法,在顶部使用 JavaFX 层并捕获触摸事件并尝试将它们作为鼠标事件分派(dispatch)到下面的 Swing 应用程序。
有人有替代方法吗?目标平台是 windows 8。
一旦 Stackoverflow 打开它,赏金就会到来。我很快就需要这个。
编辑:
这是我对 SwingNode 的尝试(鼠标重新分配不起作用)。 SwingNode 的东西可能会分散最佳解决方案的注意力,因此如果您有更好的接触 swing 的想法,请忽略它:
@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();
}
});
}
});
}
最佳答案
您可以使用 JNA 来解析来自 Windows 的消息。
Microsoft 关于多点触控事件的一些文档: https://learn.microsoft.com/en-us/windows/desktop/wintouch/wm-touchdown
关于如何在 Java 中执行此操作的一些文档和示例代码: https://github.com/fmsbeekmans/jest/wiki/Native-Multitouch-for-AWT-component-(Windows)
关于java - 向旧版 Swing 应用程序添加触摸手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594449/