2012-05-12 11 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)あなたISS適用 (実引数は、メソッド呼び出し 変換によりjava.awt.Dialogに変換できない)

+1

「JFrame」を拡張するのは本当に悪いことですが、新しい種類のJFrameを作成することはほとんどありませんが、代わりに既存のJFrameを使用したいと考えています。ここでの正しいパターンは、継承ではない構成です。これはまた、問題を完全に回避します。 – Voo

答えて

7

ありませんueは簡単です。 thisを使用している場合は、実際にActionListener.thisを使用しています。したがって、このエラーを修正するには、コンパイラに対して、包含クラスthisを実際にMyWindow.thisで指定することを説明しなければなりません。

JDialog vce = new JDialog(this); 

1本に:

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(MyWindow.this); 

ここでの問題は、匿名内部クラスのコンテキストにおいて、そのthisあります定義すると、内部クラスが定義されているMyWindowオブジェクトではなく、内部クラスを参照します。 thisからMyWindow.thisに変更すると、内部クラスではなく現在のMyWindowオブジェクトであることがJavaに通知されます。

希望すると便利です。

関連する問題