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

时间:2014-05-03 00:51:27

标签: java arrays event-handling javafx-8

我在网上到处都看了,现在已经被困了好几个小时了。我有一个程序,我在屏幕上有一个包含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?

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

1 个答案:

答案 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的一个实例,并将它的图像设置为新的。