2017-07-19 6 views
2

私はスウィングの同時実行性についてここではConcurrency in Swingを読んでいますが、私のプロジェクトでワーカースレッドをどこで実行するのかはわかりません 私はパネルを使ってコンポーネントをペイントしています何かがクリックされた場合。パネルクラスはそういう感じです。マウスをクリックした後、ボードメソッドcallAI()を呼び出します。ここでワーカースレッドを置くべきです

public class BoardPanel extend JPanel implements MouseListener , MouseMotionListener 
{ 
    private Board myBoard; 

    public BoardPanel() 
    { 
     //////////// Some code here 
    } 

    public void paintComponent(Graphics g) 
    { 
     ///Some code here 
    } 

    public void mouseClicked(MouseEvent event) 
    { 
     ///Some changes in the panel components. 
     repaint(); 
     myBoard.callAI(); 
    } 
} 

ボードクラスは以下のように実装されています。 callAI()メソッドは、クラスAIPlayerのオブジェクトプレーヤーのメソッドstartThinking()を呼び出します。これは、startThinking()メソッドが終了した後に、CPUを消費してパネルのフリーズと再描画を行うメソッドです。

public class Board 
{ 
    private AIPlayer player; 

    public Board() 
    { 
     //some code here. 
    } 

    public void callAI() 
    { 
     player.startThinking(); 
    } 

} 

私が読んだことから理解したように、ワーカースレッドを使用する必要があります。しかし、私はそれをどのクラスで使うべきか理解していません。私はSwingコンポーネントと関係があると思ってBoardPanelクラスで使う必要がありますが、JPanelを既に拡張しているのでSwingWorkerクラスを拡張することはできません。私はBoardPanelクラスの中で匿名のクラスを使うべきですか? 私の質問は、どこでSwingWorkerクラスを拡張し、doInBackground()メソッドを使用すればよいのでしょうか。

答えて

1

あなたはあなたが別のスレッドでSwingアプリケーションで力仕事のいずれかの種類をしたいstartThinking方法

startThinking() {  
     new SwingWorker<Void, Void>() { 
       @Override 
       public Void doInBackground() { 
        // do your work here 

        return null; 
       } 
     }.execute(); 
    } 

の内側に匿名SwingWorkerのを使用することができます。 SwingWorkerを拡張する別のクラスを呼び出して呼び出し、startThinkingメソッドの内部で実行することもできます。 これが正しい方向にあなたを導いてくれることを願っています!

+1

はい、これが正しい方向だった、ありがとう –

関連する問題