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

时间:2014-07-12 21:30:41

标签: java mouseevent custom-controls javafx-8

我在这里有一个冗长的问题,为什么我的自定义控件在整个地方失败了。 对于那些可能经历过类似事情的人,我发现了一篇优秀的,非常近期的文章here

太棒了,我不是在开玩笑。

但现在我有另一个问题。 我的控件上有几个Text形状,需要响应鼠标点击(单个和双重)以及控件本身。

我之前在JavaFX Scene Builder工具中将代码部分中的那些控件On Mouse Clicked条目设置为相同的方法名称,并在控制器中实现了该名称。 问题是,这是导致事故崩溃和破坏并导致我哭泣的原因。

例如在Scene Builder中,我将所有相关控件On Mouse Clicked设置为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){
}

现在看起来并不合适。除非从MouseEvent扩展ActionEvent?是这样的吗?

无论如何,我试图忽视这一点,按照我的方式去做,它爆炸了。惊喜,我现在知道为什么爆炸了。

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

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

同样,当我杀死这段代码时,它运行正常(除了实际做任何事情,我的意思是在相对意义上工作正常,它加载而不爆炸)。

那么我该如何正确捕获MouseEvent呢?它是从ActionEvent扩展的吗?这甚至不重要吗?这甚至是它爆炸的真正原因吗?

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

1 个答案:

答案 0 :(得分:0)

我觉得我发现了这个问题。 在我的构造函数中的代码设置如下之前:

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时,它引起了异常。我只能猜想为什么,但添加AFTER后的元素似乎已经解决了这个问题。无论如何,希望这对未来的某些人有用。