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



我在网上到处找,现在已经被难住了几个小时了。我有一个程序,屏幕上有一个包含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的一个实例,并把它的图像设置为新的东西。

相关内容

  • 没有找到相关文章

最新更新