Javafx -Textarea,如何仅在双击时激活Textarea



javafx 2.2 -JDK 1.8.0_121

我在矩形内有一个文本方面,恰好有鼠标侦听器。问题是,当我单击文本方面时,它会消耗事件,而矩形没有单击。

例如:

例如:
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);

在上面的情况下,文本方面的空间与矩形一样多,因此,当我单击它时,TextArea会消耗textarea。

是否有一种方法可以"禁用"或"删除" TextArea中的onMouseClickedProperty((,而是在双击时将其触发?希望单点鼠标将被矩形消耗。

谢谢。

编辑:

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

由于您无法阻止Textarea消费Moused_pressed事件,因此在TextAarea区域使用之前,处理事件的唯一方法是使用事件过滤器。

因此,请使用上面的示例代码,我称之为方法 addmouselistener(rect(而不是仅使用鼠标侦听器,而是添加事件过滤器,而不是将其添加到矩形形状中我将其添加到小组中。

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

以这种方式,组和textarea都可以单击鼠标。

注意:如果仅要组单击鼠标,您可以添加event.consume((。

我希望将来可以帮助某人寻找类似的东西。

我很确定,不幸的是,如果您希望文本区域完全对鼠标做出反应,那是所有鼠标事件的小学类,因为这是所有鼠标事件的小学类有听众。

就检测双击而言,还有另一个线程包含您正在寻求的答案。

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

编辑

也许在这种情况下,可能值得修改MIPA的答案,尝试将其添加到您的代码(在适用区域(

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;
    }
}

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

最新更新