我在网上到处找,现在已经被难住了几个小时了。我有一个程序,屏幕上有一个包含40个imageview的数组。我想要的是,当我点击数组中的特定imageView时,我希望图像在imageView中发生变化。
我有:
public void initBubbles(){
Image image = new Image("file:src/bubbles/images/bubble.png");
for (int i = 0; i < bubbles.length; i++) {
//Creates a new bubble
bubbles[i] = new Bubble(image, 'A', 1);
//Creates a new image view
ivs[i] = new ImageView(image);
//Various lines of codes that put the imageView in the scene..... (Not relevant)
ivs[i].addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent> () {
@Override
public void handle(MouseEvent event) {
System.out.println("Bubble Popped!");
ivs[i].setImage(new Image("popped.png":); //Will result in arrayOutOfBounds
}
});
}
}
我遇到的问题是从MouseEvent中获取选定的元素。我知道在"Bubble pop !"消息之后的行会导致ArrayOutOfBounds异常。但我希望你能理解我的意思。我如何获得基于MouseEvent被点击的imageView ?
任何帮助都非常感谢,因为我已经被困了几个小时。
我现在无法在编译器中检查它,但根据文档,我猜您将通过getTarget()
方法引用正确的ImageView
, MouseEvent
继承自javafx.event.Event
。
@Override
public void handle(MouseEvent event) {
final ImageView iv = (ImageView) (event.getTarget());
iv.setImage(new Image("popped.png"));
}
如果你真的希望有一个单个 EventHandler整个数组,你应该定义它的外部for循环,并将其分配给一个变量-否则你是创建一个新的实例处理程序为每个ImageView。
public void initBubbles(){
final Image image = new Image("file:src/bubbles/images/bubble.png");
// Create an event handler to be re-used for all the ImageView's
final EventHandler eventHandler = new EventHandler<MouseEvent> () {
@Override
public void handle(MouseEvent event) {
final ImageView iv = (ImageView) (event.getTarget());
iv.setImage(new Image("popped.png"));
}
}
for (int i = 0; i < bubbles.length; i++) {
//Creates a new bubble
bubbles[i] = new Bubble(image, 'A', 1);
//Creates a new image view
ivs[i] = new ImageView(image);
// Register the event handler
ivs[i].addEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
}
}
处理程序代码在不同的上下文中运行,而不是在注册处理程序(addEventHandler()),因此i
的值不具有相同的含义。您应该将handle()
方法的代码视为完全独立于其周围代码的。处理程序的"运行时上下文"信息在事件中,该事件触发处理程序。
使用一个比喻,通过调用addEventHandler()
,你告诉ImageView这个:
亲爱的ImageView,当鼠标事件在你上面发生时,调用处理程序的代码。
和处理程序:
亲爱的处理程序,当你被触发时,看看你被调用的目标,把它当作ImageView的一个实例,并把它的图像设置为新的东西。