匿名监听器里面的循环

时间:2015-05-14 13:46:26

标签: java mouselistener

这可能是一个愚蠢的问题,但在我的代码中,当在面板上执行 mouseClicked 时,循环条件中的与<的项参数相同强> ItemDialog

for (Item item: itemsList) {
        JPanel panel = new ItemPanel(item);
        panel.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent arg0) {
                new ItemDialog(item);
            }
            public void mouseEntered(MouseEvent arg0) {}
            public void mouseExited(MouseEvent arg0) {}
            public void mousePressed(MouseEvent arg0) {}
            public void mouseReleased(MouseEvent arg0) {}
});

1 个答案:

答案 0 :(得分:3)

是的,这是一个简单的答案。

但是,就像我在评论中所说,这里有很多事情发生了!

匿名内部类令人困惑:与Javascript中的闭包相似。

他们可以访问自己定义的变量。他们可以仍然在将来的任意点访问那些相同的变量引用,即使该变量超出范围。使这成为可能的规则是必须将这些变量声明为final

这篇文章比我更好地解释了这些机制:How does java implement inner class closures?

抛开:自Java 8起,编译器自动生成每个Item item变量final,因为它会发现它们在您的匿名内部类中被使用。所以他们实际上变成了:

for (final Item item: itemsList) {