有什么办法可以解决范围问题吗?编写一个通用方法来将侦听器添加到 JRadioButtonMenuItems

问题描述 投票:0回答:1

我一遍又一遍地编写相同的代码,因为当我将其编写为它自己的方法时,我遇到了范围问题,“在封闭范围中定义的局部变量......必须是最终的或有效的最终”。除了像我一直在做的那样一遍又一遍地编写代码之外,还有什么办法可以解决这个问题吗?

这有效:

        monochromeOption.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                gameboard.monochromeColor = cO;
                gameboard.monochromeColor_temp = cO;
                gameboard.repaint();
            }
        });
        monochromeOption.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}

            @Override
            public void mouseEntered(MouseEvent e) {
                gameboard.monochromeColor_temp = gameboard.monochromeColor;
                gameboard.monochromeColor = cO;
                gameboard.repaint();
            }

            @Override
            public void mouseExited(MouseEvent e) {
                gameboard.monochromeColor = gameboard.monochromeColor_temp;
                gameboard.repaint();
            }
        });

这不是:

private static <T> void addRadioListenersWithMouseOver(NerdChessGameboard board, JRadioButtonMenuItem button, T toAssign, T gameboardT, T gameboardT_temp) {
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            gameboardT = toAssign;
            gameboardT_temp = toAssign;
            board.repaint();
        }
    });
    button.addMouseListener(new MouseListener() {
        public void mouseClicked(MouseEvent e) {}
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}

        @Override
        public void mouseEntered(MouseEvent e) {
            gameboardT_temp = gameboardT;
            gameboardT = toAssign;
            board.repaint();
        }

        @Override
        public void mouseExited(MouseEvent e) {
            gameboardT = gameboardT_temp;
            board.repaint();
        }
    });
}

这是范围问题,需要一个变量为final或有效的final,我总是围绕它编写代码,但这一次它真的......丑陋。我已经将同一段代码复制粘贴了十几次,但我看不出有任何原因。我知道这就是 JVM 的工作方式,这样做是为了避免在其他情况下出现更大的错误。但在这种情况下这是没有意义的,我想要一个解决办法!哈哈。我是否遗漏了一些明显的东西,或者每个使用 Java 的人都只是围绕这个问题编写代码以换取使用 Java 的其他好处?

java local-variables
1个回答
0
投票

“...是否有一些明显我遗漏的东西,或者每个使用 Java 的人都只是围绕这个问题编写代码以换取使用 Java 的其他好处?”

Java 继承 主题通常会涵盖您所描述的问题。

由于您要在 button 对象中创建 anonymous-class,因此封装此资源。

组织数据的方法不止一种,这里是一个基本示例。

class Example<T> extends JRadioButtonMenuItem implements ActionListener, MouseListener {
    NerdChessGameboard board;
    T toAssign, gameboardT, gameboardT_temp;

    @Override
    public void actionPerformed(ActionEvent e) {
        gameboardT = toAssign;
        gameboardT_temp = toAssign;
        board.repaint();
    }

    public void mouseClicked(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {
        gameboardT_temp = gameboardT;
        gameboardT = toAssign;
        board.repaint();
    }

    @Override
    public void mouseExited(MouseEvent e) {
        gameboardT = gameboardT_temp;
        board.repaint();
    }

    class NerdChessGameboard extends JComponent { }
}
© www.soinside.com 2019 - 2024. All rights reserved.