从一个节点获取MOUSE_PRESSED事件后,无法从任何其他javafx 8节点获取鼠标事件

时间:2014-10-17 08:13:44

标签: mouseevent javafx-8

我正在创建富文本组件,其中包含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);
    }
}

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

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

我还试图为相应的Label手动触发MOUSE_RELEASED,但它也没有帮助。

感谢您的支持。

1 个答案:

答案 0 :(得分:7)

documentation for MouseEvent详细说明了处理鼠标拖动的三种不同模式。在默认模式下(&#34;简单的按下 - 拖动 - 释放手势&#34;),正如您所观察到的,鼠标事件仅传递到手势源自的节点。

完全按下 - 拖动释放手势&#34;模式,MouseDragEvent在拖动过程中被传递到其他节点。这是您需要的模式,您可以通过调用原始节点上的startFullDrag来激活它。

(第三种模式是&#34;拖放&#34;手势,用于在节点之间传输数据,通常由底层平台支持,因此您可以在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()));