JavaFX - TextArea,如何只在双击时激活textarea?

时间:2017-04-25 22:04:04

标签: java javafx event-handling textarea mouselistener

JavaFX 2.2 - JDK 1.8.0_121

我在矩形内部有一个TextArea,它也恰好有一个鼠标监听器。问题是,当我单击TextArea时,它会消耗该事件,并且矩形不会获得点击。

请考虑以下代码:

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占用了与矩形一样多的空间,所以当我点击它时,onMouseClickedProperty()事件被TextArea消耗。

有没有办法从TextArea“禁用”或“删除”onMouseClickedProperty(),而是在双击时触发它?希望单个鼠标单击将被矩形消耗。

感谢。

修改

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

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

因此,使用上面的示例代码,我调用方法 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()。

我希望能帮助将来寻找类似的东西。

2 个答案:

答案 0 :(得分:1)

我很确定你无法摆脱必须拥有MouseListener,因为这是所有鼠标事件的主要类,如果你想让文本区域对它必须拥有监听器的鼠标做出反应。

就检测到双击而言,还有另一个线程包含您正在寻找的答案answered by Uluk Biy

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

答案 1 :(得分:0)

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