我在网上到处都看了,现在已经被困了好几个小时了。我有一个程序,我在屏幕上有一个包含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获取所选元素。我理解&#34;泡泡弹后的线条!&#34;消息将导致ArrayOutOfBounds异常。但我希望你明白我在想什么。如何获取基于MouseEvent点击的imageView?
任何帮助都非常感谢,因为我已经被困了几个小时。
答案 0 :(得分:0)
我现在无法在编译器中检查它,但基于documentation我猜您会ImageView
方法引用getTarget()
MouseEvent
继承自javafx.event.Event
1}}。
所以正确的代码是这样的:
@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()),因此值{ {1}} 不具有相同的含义。您应该将i
方法的代码视为在其周围代码上完全独立且独立。 &#34;运行时上下文的信息&#34;处理程序位于事件中,触发了处理程序。
要使用比喻,通过调用handle()
告诉ImageView:
亲爱的ImageView,当您上方发生鼠标事件时,请调用处理程序的代码。
处理程序:
亲爱的处理程序,当你被触发时,看看你被调用的目标,把它当作ImageView的一个实例,并将它的图像设置为新的。