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

JavaFX-TextArea,如何仅在双击时激活TextArea?,java,javafx,event-handling,textarea,mouselistener,Java,Javafx,Event Handling,Textarea,Mouselistener,JavaFX2.2-JDK1.8.0_121 我在一个矩形内有一个文本区域,碰巧还有一个鼠标侦听器。问题是,当我点击TextArea时,它会使用事件,而矩形不会得到点击 例如,考虑以下代码: Group g = new Group(); Rectangle rect = new Rectangle(100,100); TextArea textArea = new TextArea("Test"); textArea.setTranslateX(rect.getX()); textArea.

JavaFX2.2-JDK1.8.0_121

我在一个矩形内有一个文本区域,碰巧还有一个鼠标侦听器。问题是,当我点击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使用鼠标按下的事件,因此在TextArea使用事件过滤器之前处理事件的唯一方法是使用事件过滤器

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

private void addMouseLisenter(Group group){

group.addEventFilter(MouseEvent.MOUSE_PRESSED,
                new EventHandler<MouseEvent>() {
                    public void handle(MouseEvent event) {
                        //Code here    
                    }
                 });
    }
private void addMouseListenter(组){
group.addEventFilter(MouseEvent.MOUSE_按下,
新的EventHandler(){
公共无效句柄(MouseeEvent事件){
//代码在这里
}
});
}
这样,组和文本区域都可以点击鼠标

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


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

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

至于检测双击,还有另一个线程包含您正在寻找的答案

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

编辑

也许在这种情况下,修改mipa的答案是值得的,请尝试将其添加到您的代码中(在适用的区域)

整数clickCount=0;
ScheduledThreadPoolExecutor executor=新的ScheduledThreadPoolExecutor(1);
计划的未来计划的未来;
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
如果(例如getButton().equals(MouseButton.PRIMARY)和&clickCount<1){
scheduledFuture=executor.schedule(()->clickAction(),500,时间单位为毫秒);
}
单击计数+=1;
}
});
私有void clickAction(){
如果(单击计数=1){
//单击的操作
点击计数=0;
}否则,如果(单击计数>1){
//多次单击的操作
点击计数=0;
}
}

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

以前找到了上述答案,我尝试了它,希望它能覆盖单次单击,只在双击时触发事件,但遗憾的是,单次单击仍然没有触发。我想到了一个解决办法,但还没有尝试过,我不是很喜欢。我正在考虑将TextArea可见性设置为false,并且在其顶部有一个标签,当有人双击标签时,标签将不可见,TextArea将出现。一旦焦点丢失,文本区域的文本将被传输回标签,并将标签设置为可见,对此有何想法?即使有mipa的答案?这将创建一个计时器,它将等待第二次单击,然后再假定它仅为单个?哦,抱歉,完全错过了mipas答案的这一部分,我现在正在查看,我会让您知道。谢谢。这不起作用,只需单击一下他的代码,500毫秒内就能打印出消息,但文本区域会立即获得焦点,而不是等待500毫秒结束。要修复编辑,您必须实例化executor,但即使如此,与mipa的答案也会发生同样的事情。500毫秒延迟后,单击中的代码将运行,但文本区域立即获得焦点。感觉好像还有其他事件在处理TextArea。我甚至尝试了onMouseClickedProperty()而不是onMouseClicked(),但结果相同。
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;
    }
}