如何从不同方法中定义的内部类中检索变量?

时间:2014-05-15 02:03:18

标签: java inner-classes

现在我有以下内容:

public class Panel extends JPanel {

int size;

public Panel()
{
    JButton newBut = new JButton();

    newBut.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            boolean validInput = false;
            while (!validInput)
            {
                String input = JOptionPane.showInputDialog("Please specify a number:");
                try{
                    size = Integer.parseInt(input);
                    validInput = true;
                } catch (NumberFormatException ex){
                    JOptionPane.showMessageDialog(new JFrame(), "Invalid Input!", "ERROR",JOptionPane.ERROR_MESSAGE);
                }

                if (input == null)
                {
                    validInput = true;
                }
            }
        }
    });
}

现在您可以从代码中看到,我正在尝试将用户的输入解析为整数,然后将该值存储在我的全局变量“size”中。但是,当我尝试这样做时,我收到错误:

Cannot refer to a non-final variable inside an inner class defined in a different method

将大小设置为final对我来说不是一个选项,因为我需要size每次用户输入新值时都能更改。所以老实说我不知道​​我应该如何从内部方法中检索size变量。任何帮助都会受到极大的赞赏。

2 个答案:

答案 0 :(得分:0)

是的@EJP是对的......我也尝试过在Java 8中使用netbeans ...对我来说它工作得很完美......但是如果你仍然遇到问题那么就要对你的班级实施ActionListener然后为此制作一个单独的方法......这是代码......

public class Panel extends JPanel implements ActionListener{

    int size;

    public Panel()
    {
        JButton newBut = new JButton("Button");  //give some name just to check..
        newBut.addActionListener(this);
        this.add(newBut);  //you have not added your button to the Panel..so I did it
    }

    @Override
    public void actionPerformed(ActionEvent e) {  //same method just outside the inner class
        boolean validInput = false;   //all the functionality is same as your nothing is changed
        while (!validInput)
        {
            String input = JOptionPane.showInputDialog("Please specify a number:");
            try{
                size = Integer.parseInt(input);
                validInput = true;
            } catch (NumberFormatException ex){
                JOptionPane.showMessageDialog(new JFrame(), "Invalid Input!", "ERROR",JOptionPane.ERROR_MESSAGE);
            }

            if (input == null)
            {
                validInput = true;
            }
        }
    }
    }

我认为它可以帮到你......

答案 1 :(得分:-1)

可以作弊并使用AtomicInteger或类似内容,并调用其set(int)方法。但我会重新考虑你的设计 - 为什么你试图在全球范围内存储这个价值呢?

另外,浮动

是什么
if (input == null)
{
    validInput = true;
}

阻止?