在构造函数中传递当前类,在actionlistener中传递

时间:2016-05-02 17:29:32

标签: java

所以我试图在actionlistner的构造函数中传递当前类

类似这个:

    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);
            }
        };

    }

这样的问题的一般方法是什么?或者这只是伪劣的代码?

2 个答案:

答案 0 :(得分:4)

this将指向动作侦听器的匿名实例。如果要传递封闭类的this指针,请使用<enclosingClassName>.this

e.g:

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);
        };    
    }
}

答案 1 :(得分: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);
        }
    };
}