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)は適用されません(メソッド呼び出し変換によって実際の引数をjava.awt.Dialogに変換することはできません)

4

2 に答える 2

8

あなたの問題は単純です。使用しthisているときは、実際にを使用していますActionListener.thisthisしたがって、このエラーを修正するには、包含クラスを実際に使用することをコンパイラーに説明する必要があります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); 
            } 
        }); 
    } 
} 
于 2012-05-12T22:15:53.147 に答える
5

私はあなたがこの行を置き換えたいと思います:

JDialog vce = new JDialog(this);

これに:

JDialog vce = new JDialog(MyWindow.this);

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

お役に立てれば!

于 2012-05-12T22:16:59.717 に答える