2012-05-12 103 views
2
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中)是不適用 (實際參數不能由方法調用 轉換)

+1

請注意,擴展'JFrame'通常是一個非常糟糕的主意 - 你很難創建一種新的JFrame,而是想要使用現有的JFrame。這裏的正確模式是組合而非繼承 - 這也可以完全避免這個問題。 – Voo

回答

7

你的ISS被轉換爲java.awt.Dialog中你很簡單。當您使用this時,您實際上使用ActionListener.this。所以要糾正這個錯誤,你必須向編譯器解釋你想用MyWindow.this指定它來實際使用類別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); 
      } 
     }); 
    } 
} 
5

我想你要替換這一行:

JDialog vce = new JDialog(this); 

這一個:

JDialog vce = new JDialog(MyWindow.this); 

這裏的問題是,this,在匿名內部類的環境下,你'定義,指的是內部類而不是定義內部類的對象。將this更改爲MyWindow.this告訴Java,它是當前需要的MyWindow對象,而不是內部類。

希望這會有所幫助!