如何在 Swing 应用程序中捕获并处理 JavaFX TouchEvent?

2024-01-03

我开发了一个 Swing 应用程序,现在需要在其中实现自定义的多点触摸手势。

经过一番研究,最简单的方法似乎是使用 JavaFX,因为它可以嵌入到 Swing 中,并为触摸屏上的每个手指单独提供事件。然后我尝试根据以下示例实现触摸处理:

http://docs.oracle.com/javafx/2/swing/swing-fx-interoperability.htm http://docs.oracle.com/javafx/2/swing/swing-fx-interoperability.htm

http://docs.oracle.com/javafx/2/events/touch_events.htm http://docs.oracle.com/javafx/2/events/touch_events.htm

我决定在 JPanel 之上创建一个透明的 JFXPanel,捕获所有鼠标和触摸事件。它非常适合 JavaFX 鼠标事件,但我没有收到任何触摸事件。

我在不同的可触摸 Windows 7 和 Windows 8 设备上测试了我的应用程序。我目前使用的是 Java JDK 1.8.0_45。

所以我的问题是为什么我没有收到任何触摸事件?

我将问题简化为以下两类:

图形用户界面类:

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class TestWindow extends JFrame {

    private static final long serialVersionUID = 1L;
    private static final JFXPanel jfxPanel = new JFXPanel();
    private static Scene jfxScene;
    private static TestController controller;
    private boolean enableJFXPanel;

    /**
     * Create the Frame
     * @param tc The Application's controller
     */
    public TestWindow(TestController tc) {

        this.setBounds(200,200,400,400);
        this.setResizable(false);
        this.setTitle("JavaFX in Swing Test");
        getContentPane().setLayout(null);

        controller = tc;

        // Create the swing panel
        JPanel jPanel = new JPanel();
        jPanel.setBounds(0, 0, this.getWidth(), this.getHeight());
        jPanel.addMouseListener(controller);

        // Create the button
        JButton button = new JButton("show / hide JavaFX panel");
        button.setBounds((jPanel.getWidth()/2)-100, (jPanel.getHeight()/2)-25, 200, 50);
        button.addActionListener(controller);
        jPanel.add(button);

        // Create the JavaFX panel
        jfxPanel.setBounds(0, 0, 0, 0);
        enableJFXPanel = false;     
        jPanel.add(jfxPanel);

        getContentPane().add(jPanel);

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                initAndShowGUI();
            }
        });

        this.setVisible(true);
    }

    /**
     * Initialize and Show JavaFX
     */
    private static void initAndShowGUI() {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                initFX();
            }
        });
    }

    /**
     * Initialize the JavaFX {@code Scene} and set touch controller.
     */
    private static void initFX() {
        Group  jfx_root  =  new  Group();
        jfxScene  =  new  Scene(jfx_root);
        jfxScene.setFill(Color.AQUA);

        // Register touch event listener (DOESN'T WORK !!!)
        jfxScene.setOnTouchMoved(controller);
        jfxScene.setOnTouchPressed(controller);
        jfxScene.setOnTouchReleased(controller);
        jfxScene.setOnTouchStationary(controller);

        // Test catching JavaFX mouse events (WORKS PERFECTLY !!!)
        jfxScene.setOnMouseClicked(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent event) {
                System.out.println("MOUSE CLICKED ON JAVA FX PANEL");               
            }
        });

        jfxPanel.setScene(jfxScene);
    }

    /**
     * Show / hide the JavaFX panel
     */
    public void switchJFXPanel() {
        if (enableJFXPanel) {
            jfxPanel.setBounds(0, 0, 0, 0);
            enableJFXPanel = false;
        } else {
            jfxPanel.setBounds(0, 0, this.getWidth(), this.getHeight());
            enableJFXPanel = true;
        }
    }
}

控制器类:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javafx.scene.input.TouchEvent;

public class TestController implements MouseListener, ActionListener, javafx.event.EventHandler<TouchEvent> {

    private TestWindow testWindow;

    public TestController() {
        testWindow = new TestWindow(this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("MOUSE CLICKED ON JPANEL");
    }

    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}

    @Override
    public void actionPerformed(ActionEvent e) {
        testWindow.switchJFXPanel();
    }

    @Override
    public void handle(TouchEvent event) {
        // OCCURING JAVA FX TOUCH EVENT SHALL BE WRITTEN TO CONSOLE
        System.out.println("JAVA FX TOUCH EVENT: " + event.toString());     
    }

    public static void main(String arg[]) {
        TestController test = new TestController();
    }
}

谢谢你的帮助。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swing 应用程序中捕获并处理 JavaFX TouchEvent? 的相关文章

  • GridLayout 删除 JPanel 之间的填充

    我正在从事一个计算机科学项目 但我无法找到任何解决我的问题的方法 我正在创建一个二维数组JPanels 包含通过 a 的图像GridLayout 我想删除所有面板之间的填充 边距 以便它无缝地流入单个图像 但是 setHGap 和 setV
  • 如何将 JRadioButton 组与模型一起使用

    有没有什么方法可以将一组 JRadioButtons 与数据模型关联起来 以便更容易判断选择了哪个按钮 如果有 在理想的世界中 我想将一组 N 个单选按钮与一个enum类有一个NONEvalue 和与每个单选按钮关联的一个值 我解决了我自己
  • Java Swing:如何防止系统复制、剪切、粘贴操作?

    因此 我试图阻止用户通过按 control C control X control V 来使用默认系统操作 我想在这个特定的滚动窗格内的任何地方抓住钥匙 scrollPane 将组件加载到自身中 例如 JLabel scrollPane a
  • CompletableFuture:几个任务

    如何使用 5 个 CompletableFutures 异步执行 20 个 Runnable 任务 或 1 个任务 20 次 这就是我所拥有的 Runnable task gt long startTime System currentTi
  • 为什么接口默认方法?

    学习java 8默认方法 这link https blog idrsolutions com 2015 01 java 8 default methods explained 5 minutes 就像互联网上的任何其他资源所说 从 最严格的
  • Java,将 JScrollList 放到 JPanel 上

    我想知道是否有一种方法可以使用 JPanel 在 JFrame 上添加 JList 我正在制作一个程序 我在整个互联网上搜索答案 但我找不到 无论如何 如果可能的话 最好是带有滚动窗格 有效 的 JList 这是我的代码 public st
  • 如何右对齐 Javafx 工具栏中的按钮

    我正在使用 Java FX 场景生成器构建 UI 并且希望工具栏中的按钮浮动到工具栏的右侧 我尝试更改父级 工具栏 和按钮的节点方向 但两者似乎都被忽略 添加一个没有内容的窗格 该窗格始终会增长以适应工具栏中左对齐工具和右对齐工具之间的可用
  • JavaFx GridPane布局如何为行中的元素设置边距?

    我正在使用 GridPane 布局在我的应用程序中定位事物 我想知道如何为 row 中的元素设置边距 GridPane setConstraints chip5 1 1 1 1 HPos RIGHT VPos TOP I want to s
  • 变量已在 lambda 方法中定义

    考虑以下almost可编译的 Java 8 代码 public static void main String args LinkedList
  • JFrame 中的 JavaFX 菜单

    我想在 JFrame 中使用 JavaFX 菜单 我使用 JFXPanel 嵌入它 并且它在 JFrame 中可见 但是 问题是 菜单项不响应鼠标 我可以单击菜单 但不能单击菜单项 如果我使用键盘选择 MenuItem 并按 Enter 键
  • 使用 Karate Robot DSL 来支持用 Swing 编写的 Windows 桌面应用程序和 Mac OS 支持 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于那些使用空手道机器人在 Windows 中使用 Swing 编写的自动化桌面应用程序的人 我很想知道您的体验如何 即测试运行可靠还
  • 在模块路径上使用 OpenJFX 11 JMODS 在 JDK 11 上运行 javafx 示例

    我已经从 OpenJFX 项目下载了 JavaFX Jmod 文件并将它们放在目录中G openjfx javafx jmods 11 我使用的是 OpenJDK 11 其中没有 JavaFX jmodJAVA HOME jmods即它不附
  • Java 控制台 JPanel

    你好 是否可以在 JPanel 中绘制 java 控制台返回的内容 你有教程可以遵循吗 谢谢 SW 我不记得在哪里找到这个 但我已使用我称为 TextAreaOutputStream 的类将输出流输出到 JPanel 中保存的 JTextA
  • Java Swing 应用程序消息对话框帮助

    我正在开发 Java Swing 应用程序 我需要创建一个如图所示的对话框 我不知道这个的名字 我无法解释 所以我附上一张照片 请告诉我这叫什么以及如何在我的 GUI 应用程序中创建它 给猫剥皮的方法不止一种 public final cl
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • 通过交换 UIDefaults 来改变外观

    我正在编写一个 GUI 生成器 希望用户能够更改他构建的 GUI 的 LookAndFeel 仅应更改编辑器区域内的组件的 LookAndFeel 应用程序的其余部分应保留在 SystemLookAndFeel 中 最大的问题是 LookA
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android

随机推荐