我在这里有一个冗长的问题,为什么我的自定义控件在整个地方失败了。 对于那些可能经历过类似事情的人,我发现了一篇优秀的,非常近期的文章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扩展的吗?这甚至不重要吗?这甚至是它爆炸的真正原因吗?
如果需要,我会有更多代码。
答案 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后的元素似乎已经解决了这个问题。无论如何,希望这对未来的某些人有用。