6

私は太陽のJavaチュートリアルを読んでいて、このページに出くわしました:

アプレットの作り方

「アプレットのスレッド」という見出しの下に、次のコードが見つかりました。

   //Background task for loading images.
    SwingWorker worker = (new SwingWorker<ImageIcon[], Object>() {
            public ImageIcon[] doInBackground() {
                final ImageIcon[] innerImgs = new ImageIcon[nimgs];
            ...//Load all the images...
            return imgs;
        }
        public void done() {
            //Remove the "Loading images" label.
            animator.removeAll();
            loopslot = -1;
            try {
                imgs = get();
            } ...//Handle possible exceptions
        }

    }).execute();
}

初めまして初心者ですので、的外れな質問でしたら申し訳ありません。しかし、その「.execute()」については聞いたことがありません。私はそれを理解していません.Googleからそれについて何も見つけることができません. これは…匿名の内部クラスですか?(私を修正してください)そして、画像をロードするスレッドを開始しています。run() メソッドは start() の呼び出しで呼び出されると思いましたか? この混乱を解消するのを手伝ってください。

4

2 に答える 2

8

executeの方法ですSwingWorker。そこに表示されているのは、匿名クラスがインスタンス化され、そのexecuteメソッドがすぐに呼び出されることです。

ただし、コードがコンパイルされることに少し驚いたことを認めなければなりません。なぜならexecuteworker変数に の結果を代入しているように見え、ドキュメントにはそれexecutevoid関数であることが示されているからです。

そのコードを少し分解すると、より明確になります。まず、拡張する無名クラスをSwingWorker作成し、そのインスタンスを作成します (これは括弧内の重要な部分です)。

SwingWorker tmp = new SwingWorker<ImageIcon[], Object>() {
    public ImageIcon[] doInBackground() {
            final ImageIcon[] innerImgs = new ImageIcon[nimgs];
        ...//Load all the images...
        return imgs;
    }
    public void done() {
        //Remove the "Loading images" label.
        animator.removeAll();
        loopslot = -1;
        try {
            imgs = get();
        } ...//Handle possible exceptions
    }

};

次に、結果を呼び出しexecuteて代入しますworker(これは、私にはコンパイルすべきではないように思われるビットです)。

SwingWorker worker = tmp.execute();

更新:実際、試してみましたが、コンパイルされません。素晴らしいサンプルコードではありません。これはコンパイルされます:

SwingWorker worker = new SwingWorker<ImageIcon[], Object>() {
    public ImageIcon[] doInBackground() {
            final ImageIcon[] innerImgs = new ImageIcon[nimgs];
        ...//Load all the images...
        return imgs;
    }
    public void done() {
        //Remove the "Loading images" label.
        animator.removeAll();
        loopslot = -1;
        try {
            imgs = get();
        } ...//Handle possible exceptions
    }

};
worker.execute();
于 2012-05-25T11:36:13.247 に答える
1

.execute()、匿名クラスのインスタンスで execute メソッドを呼び出しています。つまり、 によって作成されたオブジェクトですnew SwingWorker<ImageIcon[], Object>(){...}。(クラスを拡張したSwingWorkerクラスです。)

javadoc によると、このexecuteメソッドは、インスタンスによって表されるタスクが既存のワーカー スレッドで実行されるようにスケジュールします。ワーカー スレッドのライフサイクル (作成、開始など) は、Swing インフラストラクチャによって処理されます。

于 2012-05-25T11:36:50.253 に答える