从JavaFX组件处理/实现onMouseClick的正确方法是什么?

从JavaFX组件处理/实现onMouseClick的正确方法是什么?,java,mouseevent,custom-controls,javafx-8,Java,Mouseevent,Custom Controls,Javafx 8,我在这里有一个冗长的问题,为什么我的自定义控件到处都失败了。 对于那些可能有过类似经历的人,我发现了一篇优秀的、最近的文章 太棒了,我不是在开玩笑 但现在我有另一个问题。 我的控件上有几个文本形状,它们需要响应鼠标的单键和双击以及控件本身 以前,我在JavaFX场景生成器工具中,将代码部分中鼠标单击的条目上的控件设置为相同的方法名称,并在控制器中实现该名称。 问题是,这正是导致事情崩溃和破裂并导致我哭泣的原因 例如,在场景生成器中,我将鼠标单击时的所有相关控件设置为handleMouse通用方法

我在这里有一个冗长的问题,为什么我的自定义控件到处都失败了。 对于那些可能有过类似经历的人,我发现了一篇优秀的、最近的文章

太棒了,我不是在开玩笑

但现在我有另一个问题。 我的控件上有几个文本形状,它们需要响应鼠标的单键和双击以及控件本身

以前,我在JavaFX场景生成器工具中,将代码部分中鼠标单击的条目上的控件设置为相同的方法名称,并在控制器中实现该名称。 问题是,这正是导致事情崩溃和破裂并导致我哭泣的原因

例如,在场景生成器中,我将鼠标单击时的所有相关控件设置为handleMouse通用方法名称,我知道,但这符合我的目的。然后,我在控制器中安装了另一种方法来处理鼠标事件:

@FXML
protected void handleMouse(MouseEvent ME){
    if (ME.getClickCount() > 1) //Do stuff
    else if (/*Other Condition*/) //Do something else
    else if (/*Final Condition*/) //Do something else
}
我认为这是正确的,但是!按照我所联系的指南,我发现我很可能弄错了。当我从JavaFX Scene Builder查看界面的控制器框架时,我发现它正在像这样炮轰事件:

@FXML
protected void handleMouse(ActionEvent e){
}
this.texts = new ArrayList<>();
this.texts.add(this.shapeName);
this.texts.add(this.shapeNameValue);
this.texts.add(this.shapeScore);
this.texts.add(this.shapeScoreValue);

this.loader = new FXMLLoader(
    this.getClass().getResource("JPlayer.fxml")
);
this.loader.setController(this);
this.loader.setRoot(this);

try { this.loader.load(); }
catch( IOException ex ) { throw new RuntimeException(ex); }
现在看来这是不对的。除非MouseeEvent从ActionEvent扩展而来?是这样吗

不管怎样,我试图无视这一点,按照我的方式去做,结果它爆炸了。我现在知道它为什么会爆炸了

即使尝试设置每个control.onMouseClacked的lambda也会使其爆炸:

this.texts.stream().foreach((Text txt -> { //texts stores all the controls Text objects for convenient access.
    txt.setOnMouseClicked((MouseEvent ME) -> {
        //Do stuff here (See above)
    };
});
同样,当我杀死这段代码时,它工作得很好,除了实际做任何事情,我的意思是在相对意义上工作得很好,它加载时没有爆炸

那么,我该如何正确地捕捉鼠标事件呢?它是从ActionEvent扩展而来的吗?这有关系吗?这就是它爆炸的真正原因吗


如果需要,我有更多的代码。

我觉得我找到了问题所在。 在我在构造函数中的代码设置为这样之前:

@FXML
protected void handleMouse(ActionEvent e){
}
this.texts = new ArrayList<>();
this.texts.add(this.shapeName);
this.texts.add(this.shapeNameValue);
this.texts.add(this.shapeScore);
this.texts.add(this.shapeScoreValue);

this.loader = new FXMLLoader(
    this.getClass().getResource("JPlayer.fxml")
);
this.loader.setController(this);
this.loader.setRoot(this);

try { this.loader.load(); }
catch( IOException ex ) { throw new RuntimeException(ex); }

然后,当我试图流式处理arraylist时,它导致了一个异常。我只能猜测原因,但在之后添加元素似乎解决了问题。无论如何,我希望这对将来的人会有帮助。

你的鼠标处理程序获取MouseEvent的方法在我看来是正确的。你说的爆炸是什么意思?到底出了什么问题?对narroy来说,我只是稍微降低了在这个位置发生的碰撞接缝:this.text.stream.forEachText txt->{…};它在崩溃之前从来没有出现过,它抛出了一个非常一般的异常。看这个粘贴箱:好的,问题解决了。可能是我在调用加载程序之前将文本添加到数组中,但切换顺序似乎已经纠正了这一点。哇!