关于java:JavaFX – TextArea,如何只在双击时激活textarea?

JavaFX - TextArea, how to activate the textarea only on double click?

JavaFX 2.2-JDK 1.8.0 U 121

我在一个矩形内有一个文本区域,它恰好有一个鼠标监听器。问题是,当我单击文本区域时,它会消耗事件,而矩形不会得到单击。

例如,考虑以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Group g = new Group();

Rectangle rect = new Rectangle(100,100);

TextArea textArea = new TextArea("Test");
textArea.setTranslateX(rect.getX());
textArea.setTranslateY(rect.getY());
textArea.setMinWidth(rect.getWidth());
textArea.setMinHeight(rect.getHeight());

//Calling a method to add an onMouseClickedProperty() mouse listener to the rectangle
addMouseListener(rect)

g.getChildren().addAll(rect, textArea);

在上面的例子中,文本区域占用的空间与矩形一样多,所以当我单击它时,onMouseClickedProperty()事件会被文本区域占用。

有没有一种方法可以"禁用"或"删除"文本区域中的onMouseClickedProperty(),并在双击时触发它?希望一次鼠标点击会被矩形消耗掉。

谢谢。

编辑:

我找到了一个可行的解决方案,它并不完美,但比评论中讨论的更合适。

由于无法阻止文本区域使用鼠标按下的事件,因此在文本区域使用事件筛选器之前处理事件的唯一方法是。

因此,使用上面的示例代码,我调用add mouse listener(rect)方法,而不是只使用鼠标侦听器,而是添加一个事件过滤器,而不是将其添加到矩形中,而是将其添加到组中。

1
2
3
4
5
6
7
8
9
private void addMouseLisenter(Group group){

group.addEventFilter(MouseEvent.MOUSE_PRESSED,
                new EventHandler<MouseEvent>() {
                    public void handle(MouseEvent event) {
                        //Code here    
                    }
                 });
    }

这样,组和文本区域都会得到鼠标单击。

注意:如果只想让组获得鼠标单击,可以添加event.consume()。

我希望这能帮助人们在未来寻找类似的东西。


我很肯定你不能不必使用mouseListener,不幸的是,这是所有鼠标事件的主要类,如果你想让文本区域对鼠标做出反应,它必须有侦听器。

就检测到双击而言,还有一个线程包含您正在寻找的答案,该答案由uluk biy回答。

MIPA提出的另一个答案可能会回答您关于单点和双击之间差异检测的问题,但是如果节点相互重叠。

编辑

在这种情况下,可能需要修改mipa的答案,尝试将其添加到代码中(在适用的区域中)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Integer clickCount = 0;

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
ScheduledFuture<?> scheduledFuture;

root.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent e) {
            if (e.getButton().equals(MouseButton.PRIMARY) && clickCount < 1) {
                    scheduledFuture = executor.schedule(() -> clickAction(), 500, TimeUnit.MILLISECONDS);    
            }
            clickCount += 1;
        }
});

private void clickAction() {
    if (clickCount == 1) {
       //actions for single click
       clickCount = 0;
    } else if (clickCount > 1) {
       //action for multiple clicks
       clickCount = 0;
    }
}


我找到了一个比讨论的更合适的解决方案,在我的问题中选择编辑。