加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

mouseevent – 从一个节点获取MOUSE_PRESSED事件后,无法从任何其

发布时间:2020-12-15 04:23:04 所属栏目:Java 来源:网络整理
导读:我正在创建富文本组件,其中包含 JavaFX项目的选择功能并面临一些困难. 我试图抓住哪个TextFlow对象用户按下鼠标按钮,然后另一个TextFlow释放它.但是在MOUSE_PRESSED事件之后,我只能与那个解雇它的TextFlow进行交互,直到我释放鼠标. 以下是标签的类似示例: p
我正在创建富文本组件,其中包含 JavaFX项目的选择功能并面临一些困难.
我试图抓住哪个TextFlow对象用户按下鼠标按钮,然后另一个TextFlow释放它.但是在MOUSE_PRESSED事件之后,我只能与那个解雇它的TextFlow进行交互,直到我释放鼠标.

以下是标签的类似示例:

package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        AnchorPane root = new AnchorPane();
        primaryStage.setTitle("Events Problem Example");
        primaryStage.setScene(new Scene(root,800,600));

        VBox mainVB = new VBox();
        root.getChildren().add(mainVB);

        //########## Code is here:
        for (int i = 0; i < 5; i++) {
            final Label label = new Label("label№"+i);
            mainVB.getChildren().addAll(label);

            label.setOnMouseEntered(mouseEvent -> System.out.println("entering " + label.getText()));
            label.setOnMousePressed(mouseEvent -> System.out.println("press mouse button on " + label.getText()));
            label.setOnMouseReleased(mouseEvent -> System.out.println("release mouse button on " + label.getText()));
        }
        //########################

        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

尝试将鼠标移到不同的标签上并在命令行中查看消息.然后在任何标签上按住鼠标主按钮并再次移动它.在释放按钮之前,您将看到没有其他标签会触发任何事件.

我花了一些时间寻找解决方案,但一无所获.

我还尝试手动触发相应标签的MOUSE_RELEASED,但它也没有帮助.

感谢您的支持.

解决方法

documentation for MouseEvent详细介绍了处理鼠标拖动的三种不同模式.在默认模式(“简单按下 – 拖动 – 释放手势”)中,正如您所观察到的,鼠标事件仅传递到手势源自的节点.

在“完全按下 – 拖动释放手势”模式下,MouseDragEvents在拖动期间被传递到其他节点.这是您需要的模式,您可以通过在原始节点上调用startFullDrag来激活它.

(第三种模式是“拖放”手势,用于在节点之间传输数据,通常由底层平台支持,因此您可以在JavaFX应用程序和其他应用程序之间以及应用程序内拖放.)

请为您的事件处理程序尝试以下代码:

label.setOnDragDetected(mouseEvent -> label.startFullDrag());
        label.setOnMouseDragEntered(mouseEvent -> System.out.println("entering " + label.getText()));
        label.setOnMouseDragReleased(mouseEvent -> System.out.println("release mouse button on " + label.getText()));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读