编译错误将此指针传递给构造函数?

时间:2012-05-12 22:13:19

标签: java scope jframe this jdialog

public class MyWindow extends JFrame {

    JButton botonCreate = new JButton("Open son windows");

    public void doSomething(){
        botonCreate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JDialog vce = new JDialog(this);
            }
        });
    }
}

这个想法是在孩子可见时阻止JFrame父(JDialog)。

JDialog的构造函数的参数必须是包含类“MyWindow”,但是范围问题是ActionListener,这会产生以下错误。

我该如何解决这个问题?

错误消息:

  

找不到合适的JDialog()构造函数       构造函数JDialog(java.awt.Frame)不适用         (实际参数不能通过方法调用转换转换为java.awt.Frame)       构造函数JDialog(java.awt.Dialog)不适用         (实际参数不能通过方法调用转换为java.awt.Dialog   转化率)

2 个答案:

答案 0 :(得分:7)

你的问题很简单。当您使用this时,您实际上正在使用ActionListener.this。因此,要纠正此错误,您必须通过使用this指定实际使用封闭类MyWindow.this来向编译器解释。

class MyWindow extends JFrame { 

    JButton botonCreate = new JButton("Open son windows"); 

    public void doSomething(){ 
        botonCreate.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent e) { 
                JDialog vce = new JDialog(MyWindow.this); 
            } 
        }); 
    } 
} 

答案 1 :(得分:5)

我想你要替换这一行:

JDialog vce = new JDialog(this);

到这一个:

JDialog vce = new JDialog(MyWindow.this);

这里的问题是this,在您定义的匿名内部类的上下文中,引用内部类而不是定义内部类的MyWindow对象。将this更改为MyWindow.this会告诉Java它是您想要的当前MyWindow对象,而不是内部类。

希望这有帮助!