在Java中为整个数组使用单个EventHandler

在Java中为整个数组使用单个EventHandler,java,arrays,event-handling,javafx-8,Java,Arrays,Event Handling,Javafx 8,我在网上到处找了找,现在已经被难住几个小时了。我有一个程序,在屏幕上有40个图像视图的数组。我希望发生的是,当我单击数组中的特定imageView时,我希望图像在imageView中发生更改 以下是我所拥有的: public void initBubbles(){ Image image = new Image("file:src/bubbles/images/bubble.png"); for (int i = 0; i < bubbles.length; i++) {

我在网上到处找了找,现在已经被难住几个小时了。我有一个程序,在屏幕上有40个图像视图的数组。我希望发生的是,当我单击数组中的特定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
            }
        });

    }

}
public void initBubbles(){
Image Image=新图像(“文件:src/bubbles/images/bubble.png”);
对于(int i=0;i
我遇到的问题是从MouseeEvent获取所选元素。我知道“Bubble Popped!”消息后面的行将导致ArrayOutOfBounds异常。但我希望您理解我的意图。如何获取基于MouseeEvent单击的imageView


非常感谢您的帮助,因为我已经被困了几个小时。

我现在无法在编译器中检查它,但根据我的建议,我想您将通过
getTarget()
方法引用正确的
ImageView
,该方法继承自
javafx.event.event

所以正确的代码应该是这样的:

@Override
public void handle(MouseEvent event) {
    final ImageView iv = (ImageView) (event.getTarget());
    iv.setImage(new Image("popped.png"));
}
如果您真的希望整个数组有一个单个事件处理程序,那么应该在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);
    }
}
public void initBubbles(){
最终图像=新图像(“文件:src/bubbles/images/bubble.png”);
//创建一个事件处理程序,用于所有ImageView的
final EventHandler EventHandler=新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
final ImageView iv=(ImageView)(event.getTarget());
iv.setImage(新图像(“popped.png”);
}
}
对于(int i=0;i

处理程序代码在<>强>不同的上下文中登记的处理程序()的值,因此<>代码> i <代码>的值没有相同的含义。你应该考虑代码< >手()/<代码>方法完全独立和独立于它周围的代码。处理程序的属性在事件中,该事件触发了处理程序

要使用寓言,通过调用
addEventHandler()
可以告诉ImageView:

亲爱的ImageView,当鼠标事件发生在您上方时,请调用处理程序的代码

和处理程序:

亲爱的HANDER,当你被触发时,看看你被调用的目标,把它想象成一个图像的实例,并把它的图像设置成新的东西。


哇,真是太感谢你了!非常好!再次感谢你!我已经对我的答案添加了一些解释,说明它是如何工作的。另外,这是我第一次看到Java FX:)我在上面提到的文档中找到了答案。(路加福音10:37):)请再看看我编辑过的答案——我补充了更详细的解释。