我正在创建富文本组件,其中包含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,但它也没有帮助。
感谢您的支持。
答案 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()));