java - 向旧版 Swing 应用程序添加触摸手势

标签 java swing multi-touch javafx-8

我有一个遗留的 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/

相关文章:

java - servlet 检查参数

Java - 单线程执行器

java - 多个ListCell渲染器

java - 如何在框架东边设置两个面板

wpf - 区分 TouchUp 和 TouchLeave 以及 TouchDown 和 TouchEnter 的策略?

c# - 应用程序,提高触摸事件的性能

java - JBOSS Standalone 上的 war 服务器在哪里将其视为 Linux 上的主目录?

java - 有人使用 Junit4 与 cpsuite-1.2.5 和 EasyMock 吗?

java - JTextArea 不显示

c# - 捕获所有 Windows 7 触摸事件,而不仅仅是在我的窗体具有焦点时捕获