2016-05-02 5 views
1

Так что я пытаюсь передать текущий класс внутри конструктора с actionlistnerПередача текущего класса в конструкторе, внутри ActionListener

что-то вроде этого :

public ActionListener createTaskListener() { 
     return new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       CreateTask ct = new CreateTask(); 
       CreateTaskController ctc = new CreateTaskController(ct, mod.getAssessments(), this); 
       // but it says anonymous actionlistener 
       ctc.loadDataToTaskView(); 
       ct.setVisible(true); 
      } 
     }; 

    } 

Каков общий подход к такая проблема? Или это просто дрянной код?

ответ

4

this будет указывать на анонимный экземпляр слушателя действий. Если вы хотите передать указатель 10 прилагаемого класса, используйте <enclosingClassName>.this.

.: например

class MyClass { 
    public ActionListener createTaskListener() { 
     return new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       ... 
       CreateTaskController ctc = 
        new CreateTaskController(ct, mod.getAssessments(), MyClass.this); // <- 
       ... 
      } 

     }; 

    } 
} 

В качестве примечания. ActionListener - функциональный интерфейс. Таким образом, можно упростить код с lambda expression:

class MyClass { 
    public ActionListener createTaskListener() { 
     return ae -> { 
      CreateTask ct = new CreateTask(); 
      CreateTaskController ctc = 
       new CreateTaskController(ct, mod.getAssessments(), MyClass.this); 

      ctc.loadDataToTaskView(); 
      ct.setVisible(true); 
     };  
    } 
} 
0

this внутри внутреннего класса относится к экземпляру внутреннего класса. Чтобы ссылаться на экземпляр закрывающего класса, вы можете использовать OuterclassName.this.

Например

public ActionListener createTaskListener() { 
    return new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      CreateTask ct = new CreateTask(); 
      CreateTaskController ctc = new CreateTaskController(ct, mod.getAssessments(), YourClassName.this); 
      // but it says anonymous actionlistener 
      ctc.loadDataToTaskView(); 
      ct.setVisible(true); 
     } 
    }; 
} 
+0

почему вы голосуете меня down.is мое решения не делать то же самое, как acceptd answer.Is его bcos я просил голосование? и что не так с этим. Давайте будем объективными – suulisin

+0

Хорошо, я сожалею. Не повторю его в следующий раз – suulisin

+0

ok. в основном это внутри внутреннего класса относится к внутреннему классу. Поэтому, чтобы ссылаться на внешний класс, вы используете OuterclassName.this.Это лучшее, что я могу объяснить. я действительно сожалею. в следующий раз я буду сопровождать свой ответ с небольшим количеством объяснений – suulisin

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