2017-07-19 3 views
2

J'ai lu sur la concomitance Swing ici Concurrency in Swing mais je ne comprends pas où exécuter mon fil de travail dans mon projet J'ai un panneau qui peint le composant, qui appelle une méthode d'un autre objet au cas si quelque chose est cliqué. La classe du panel semble quelque chose comme ça. Après avoir cliqué sur la souris, nous appelons la méthode du tableau callAI();où devrais-je mettre le fil de travail

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(); 
    } 
} 

La classe board est implémentée comme ci-dessous. La méthode callAI() appelle la méthode startThinking() du lecteur d'objets de la classe AIPlayer. C'est la méthode qui consomme le CPU et fait geler et repeindre le panneau après la fin de la méthode startThinking().

public class Board 
{ 
    private AIPlayer player; 

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

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

} 

Comme je l'ai compris d'après ce que j'ai lu, j'ai besoin d'utiliser le thread de travail. Mais je ne comprends pas dans quelle classe devrais-je l'utiliser. Je pensais que cela avait à voir avec les composants Swing, donc je dois l'utiliser dans la classe BoardPanel, mais je ne peux pas étendre la classe SwingWorker parce que j'ai déjà étendu JPanel. Dois-je utiliser une classe anonyme dans la classe BoardPanel? Donc ma question est, où devrais-je étendre la classe SwingWorker et utiliser la méthode doInBackground() et pourquoi.

Répondre

1

Vous pouvez utiliser un SwingWorker anonyme à l'intérieur de la méthode startThinking

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

        return null; 
       } 
     }.execute(); 
    } 

Vous voulez faire une sorte de soulever des objets lourds dans une application Swing dans un autre thread. Vous pouvez même dédier une autre classe qui étend SwingWorker à appeler et exécuter à l'intérieur de la méthode startThinking. J'espère que cela vous mènera dans la bonne direction!

+1

oui c'était la bonne direction, merci –