我在这里有一个冗长的问题,关于为什么我的自定义控件到处都失败了。对于那些可能经历过类似事情的人,我找到了一篇很好的最近的文章here。
太棒了,我不是开玩笑。
但现在我有了另一个问题。我的控件上有几个文本形状,它们需要响应鼠标单击(包括单击和双击)以及控件本身。
我之前在JavaFX场景生成器工具中将代码部分中的那些控件On Mouse Clicked条目设置为相同的方法名称,并在控制器中实现了该名称。问题是,这就是导致事情崩溃和崩溃并让我哭的原因。
例如,在场景生成器中,我将所有相关控件的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场景创建器中查看界面的控制器骨架时,我发现它是这样对事件进行外壳处理的:
@FXML
protected void handleMouse(ActionEvent e){
}现在看起来不太对劲。除非MouseEvent是从ActionEvent扩展的?真的是这样吗?
不管怎样,我试着忽略这一点,按我的方式做,它爆炸了。令人惊讶的是,我现在知道它为什么爆炸了。
甚至尝试为每个control.onMouseClicked设置一个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)
};
});同样,当我终止这段代码时,它工作得很好(除了实际做任何事情之外,我的意思是在相对意义上工作得很好,它加载时没有爆炸)。
那么我该如何正确地捕获MouseEvent呢?它是从ActionEvent扩展的吗?这有什么关系吗?这是它爆炸的真正原因吗?
如果需要,我有更多的代码。
发布于 2014-07-13 21:21:41
我觉得我找到了问题所在。在构造函数中的代码像这样设置之前:
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时,它导致了一个异常。我只能猜测为什么,但在后面添加元素似乎已经解决了问题。无论如何,希望这能在将来对某些人有所帮助。
https://stackoverflow.com/questions/24717505
复制相似问题