拖动手势活动时未引发 JavaFX KeyEvent

2024-04-11

所以我的问题是这样的,我正在实现一个 UI 创建工具,需要使用边缘上的拖动手势来调整元素的大小。当在检查是否按下修饰键时执行此拖动(即实现统一缩放)时会出现问题。当拖动手势处于活动状态时,永远不会引发键事件,因此我无法在拖动期间激活/停用此状态,这显然不是理想的!我的问题是,JavaFX 中是否有某种原因导致这种情况?有什么解决方法吗?我可以访问原始键盘状态,即没有事件回调吗?


这似乎对我来说效果很好:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Tooltip;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class DraggableStretchableNodeExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        Pane root = new Pane();

        Rectangle rect = new Rectangle(50, 50, 50, 50);
        rect.setFill(Color.CORNFLOWERBLUE);

        Tooltip tooltip = new Tooltip("Drag to move, Z+Drag to stretch");
        Tooltip.install(rect, tooltip);

        root.getChildren().add(rect);

        enableDragging(rect);

        Scene scene = new Scene(root,400,400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void enableDragging(Rectangle rect) {

        // A mutable struct-like nested class for the last known mouse location:
        class MouseLocation { 
            double x, y ; 
            void set(double x, double y) {
                this.x=x ;
                this.y=y ;
            }
        }
        MouseLocation mouseLocation = new MouseLocation();

        // Another for the 'Z' key state:
        class Zstate {
            boolean pressed ;
        }
        Zstate zState = new Zstate();

        rect.setOnMousePressed(event -> mouseLocation.set(event.getX(), event.getY()));
        rect.setOnMouseDragged(event -> {
            if (zState.pressed) {
                stretch(rect, event.getX(), event.getY(), event.getX()-mouseLocation.x, event.getY()-mouseLocation.y);
            } else {
                move(rect, event.getX()-mouseLocation.x, event.getY()-mouseLocation.y);
            }
            mouseLocation.set(event.getX(), event.getY());
        });

        rect.setFocusTraversable(true);
        rect.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.Z) {
                zState.pressed = true ;
            }
        });
        rect.setOnKeyReleased(event -> {
            if (event.getCode() == KeyCode.Z) {
                zState.pressed = false ;
            }
        });

    }

    private void stretch(Rectangle rect, double x, double y, double deltaX, double deltaY) {

        if (x < rect.getX() + rect.getWidth() / 2) {
            // if the mouse is in the left half, stretch left by adjusting x and width:
            rect.setX(rect.getX() + deltaX);
            rect.setWidth(rect.getWidth() - deltaX);
        } else {
            // if in the right half, just stretch by adjusting the width:
            rect.setWidth(rect.getWidth() + deltaX);
        }

        // same vertically:
        if (y <rect.getY() + rect.getHeight() / 2) {
            rect.setY(rect.getY() + deltaY);
            rect.setHeight(rect.getHeight() - deltaY);
        } else {
            rect.setHeight(rect.getHeight() + deltaY);
        }

    }

    private void move(Rectangle rect, double deltaX, double deltaY) {
        rect.setX(rect.getX()+deltaX);
        rect.setY(rect.getY()+deltaY);
    }

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

拖动手势活动时未引发 JavaFX KeyEvent 的相关文章

  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • android ndk 多点触控?

    我正在编写一个仅使用本机代码的应用程序 那么ndk中是否可以获取多点触控事件呢 我感觉我已经搜索了整个网络 但什么也没找到 有谁知道如何做到这一点 是的 您可以检查名为native activity查看如何获取输入事件 寻找engine h
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐