не могу получить доступ к модификаторам внешнего класса (Java) - PullRequest
1 голос
/ 10 октября 2010
public class MainFrame extends JFrame {
    MainFrame()
    {
        JButton zeroButton = new JButton("0");
        add(zeroButton);

        Handler handler = new Handler();
        zeroButton.addActionListener(handler);
    }

    private class Handler implements ActionListener
    {

        public void actionPerformed(ActionEvent e) {
              if (e.getSource() == **zeroButton**)
                  JOptionPane.showMessageDialog(null, "hello there!");
        }
    }
}

В коде есть ошибка, которая подчеркивает то, что я пометил в коде как полужирный. вот сообщение об ошибке: «не удается найти символ»

Я думал, что могу получить доступ к модификаторам внешнего класса из внутреннего класса, но это не работает!

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

zeroButton не является членом внешнего класса (MainFrame), это локальная переменная в конструкторе MainFrame.

Попробуйте что-то вроде этого

public class MainFrame extends JFrame {
    private final JButton zeroButton;

    MainFrame() {
        zeroButton = new JButton("0");

PS Я также не уверен, стоит ли сравнивать элементы управления с ==. (никогда не использовал качели)

1 голос
/ 10 октября 2010

Вы не можете получить к нему доступ, потому что кнопка является локальной переменной в другом методе.

У вас есть два варианта: 1. Сделайте кнопку в переменной экземпляра (переменная уровня класса). См. Ответ Никиты.

  1. Иметь обработчик как анонимную реализацию в конструкторе:

    MainFrame() {        
        final JButton zeroButton = new JButton("0");  
        add(zeroButton);  
        Handler handler = new Handler();  
        zeroButton.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e) { 
              if (e.getSource() == **zeroButton**) 
                  JOptionPane.showMessageDialog(null, "hello there!"); 
        } 
    
        });  
    }
    

В этом случае переменная должна быть конечной, поскольку только внутренние локальные переменные доступны для внутренних классов.

...