如何使用 "for loop" 中的变量值进行 mouseEntered?

How to use the value of the variable from "for loop" for mouseEntered?

如何在 panelResult[i].addMouseListener 中获取 "for loop" 中用于 mouseEntered 的 "i" 变量?谢谢!

buttonCategory[0].addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {

            //hidden codes here...

            panelCategory.remove(scrollPane);
            panelCategory.add(scrollPane);
            panelArray.removeAll();
            panelResult = new JPanel[totalCount];
            int y = 0;
            for(int i = 0; i < panelResult.length; i++){

                panelResult[i] = new JPanel();
                panelResult[i].setLayout(null);
                panelResult[i].setBackground(new Color(27, 182, 32));
                panelResult[i].setBounds(0, y, 730, 200);
                panelArray.add(panelResult[i]);

                //hidden codes here...

                panelResult[i].add(labelArrayResult);

                panelResult[i].addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseEntered(MouseEvent e) {
                        panelResult[0].setBackground(Color.BLACK);
                        //if i change it to panelResult[i].setBackground(Color.BLACK); the "i" will be the error. i want to get the value of i from the panelResult[i].
                        revalidate();
                        repaint();
                    }

                });

            }

            revalidate();
            repaint();
        }

            revalidate();
            repaint();
        }

    });

我还打算将它用于 mouseClicked 和 mouseExited。它是一个结果列表,这就是为什么它全部排列和循环的原因。

我得到的异常是:

Exception in thread "AWT-EventQueue-0" 
    java.lang.ArrayIndexOutOfBoundsException: 7
    at ph.edu.tip.cpedepartment.cpepds.ProjectDesignPage.mouseEntered(ProjectDesign‌​Page.java:233)

此外,面板的数量来自数据库的总数,这就是我需要使用索引的原因。再次感谢!

相信你可以使用鼠标事件源获取事件源:

                public void mouseEntered(MouseEvent e) {
                    ((JPanel)e.getSource()).setBackground(Color.BLACK);
                    //the index here is the error
                    revalidate();
                    repaint();
                }

如果还是不行,我会试试 :

        for(int i = 0; i < panelResult.length; i++){

            //some hidden codes here...
            final JPanel panel = panelResult[i];
            panel.add(labelArrayResult);

            panel.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseEntered(MouseEvent e) {
                    panel.setBackground(Color.BLACK);
                    //the index here is the error
                    revalidate();
                    repaint();
                }

            });

        }

问题是,你为什么首先要 i?您想要实际索引值,还是想要索引 i 处的 panelResult?如果只是panelResult你想要的,就采纳Eran的回答吧

否则,您可以将 i 值复制到侦听器的成员变量中,如下所示:

    for (int i = 0; i < panelResult.length; i++) {
        final int finalI = i;

        // some hidden codes here...

        panelResult[i].add(labelArrayResult);

        panelResult[i].addMouseListener(new MouseAdapter() {

            private int innerI = finalI;

            @Override
            public void mouseEntered(MouseEvent e) {
                panelResult[innerI].setBackground(Color.BLACK);
                revalidate();
                repaint();
            }

        });
    }
  • 匿名内部class只能看到final变量,所以我创建finalI
  • 以后需要记住,所以创建innerI
  • 当然,这些变量的名称仍然可以自由选择。