2012-04-25 2 views
1

Я только начал раздумывать над самой Java и Java Swing, и у меня есть некоторые проблемы с пониманием концепции «Action Listener». Люди говорят, что C# и Java очень похожи друг на друга, но это еще одна история, когда вы на самом деле пытаетесь их обойти и сравнивать.Понимание ActionListener

У меня есть следующий автоматически сгенерированный Действие Listener для кнопки:

btnNewButton.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     lblNylabel.setText("New label text"); 
    } 
}); 

Я понимаю это так:

  1. Вы называете нестатический метод с помощью объекта «btnNewButton» btnNewButton.addActionListener()
  2. Метод принимает один экземпляр ActionListener как аргумент
  3. Авто связанный код запускает экземпляр ActionListener с помощью вызова конструктора «new ActionListener()». Я не понимаю, что я не могу сам инициализировать класс ActionListener, но это возможно в качестве аргумента в вызове метода?
  4. метод
  5. А «actionPerformed» генерируется внутри нового тела экземпляра и используется здесь (Что?)
  6. Внутри метода «actionPerformed» вы определяете, что делать, когда кнопка нажата - Заставляет прекрасно чувствовать

Возможно ли это сделать более понятным/простым способом, который мог бы помочь мне понять концепцию ActionListener?

ответ

12

То, что я не понимаю, что я не могу instansiate классу ActionListener себя, но это возможно в качестве аргумента в вызове метода ??

Когда вы

new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     lblNylabel.setText("New label text"); 
    } 
} 

Вы фактически создаете экземпляр anonymous subclass из ActionListener.

Это семантически эквивалентно делать

class AnonymousActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     lblNylabel.setText("New label text"); 
    } 
} 

btnNewButton.addActionListener(new AnonymousActionListener()); 

(тада, в качестве бонуса, вы только что узнали, что вы можете иметь method local classes в Java ;-)


Вот несколько общих альтернативы:

  1. Использовать отдельный класс:

    class MyActionListener implements ActionListener { 
        public void actionPerformed(ActionEvent e) { 
         lblNylabel.setText("New label text"); 
        } 
    } 
    
    class YourClass { 
    
        public void yourMethod() { 
         ... 
         btnNewButton.addActionListener(new MyActionListener()); 
        } 
    } 
    

    (возможно, только если другой класс имеет доступ к требуемым переменным.)

  2. То же, что и выше, но с внутренним (не статический) классом:.

    class YourClass { 
    
        public void yourMethod() { 
         ... 
         btnNewButton.addActionListener(new MyActionListener()); 
        } 
    
        // Inner class 
        class MyActionListener implements ActionListener { 
         public void actionPerformed(ActionEvent e) { 
          lblNylabel.setText("New label text"); 
         } 
        } 
    } 
    

    (здесь lblNylabel, вероятно, будет в области видимости внутреннего класса)

  3. Пусть охватывающий класс реализует ActionListener и использует this в качестве аргумента для addActionListener:

    class YourClass implements ActionListener { 
    
        public void yourMethod() { 
         ... 
         btnNewButton.addActionListener(this); 
        } 
    
        public void actionPerformed(ActionEvent e) { 
         lblNylabel.setText("New label text"); 
        } 
    } 
    
+0

Благодарим за полезный ответ. Не могли бы вы привести несколько примеров того, как это сделать без анонимных подклассов в более «простой» форме? (Даже если анонимные подклассы считаются передовой практикой) – Birdman

+0

обновленный ответ. – aioobe

Смежные вопросы