2013-02-20 3 views
0

J'ai créé un code Java (swing GUI JFrame form) qui appelle une autre fonction de classe (qui est dans un autre projet) lorsque le bouton est pressé, mais il faut que je clique deux fois sur le bouton afin de renvoyer avec succès la valeur de la fonction appelée. y-a-t'il une solution?java remote function besoin d'appeler deux fois

ici est mon code,

L'interface graphique

package aarib; 

import java.awt.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import AlKhalil.ui.Aarib; 

public class GUI extends javax.swing.JFrame { 

    public String Input; 
    public String Lexems; 
    public Aarib A; 

public GUI() { 
     initComponents(); 
     A = new Aarib(); 
     jTextField1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
     jLabel2.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 

    } 
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 

     if(jTextField1.getText().isEmpty()) 
     { 
      jLabel2.setText("No input"); 
     } 
     else{ 
      Input = jTextField1.getText().toString(); 
      A.inputText= Input; 
      try { 

       Lexems = A.LexicalAnalysis(); 
       jLabel2.setText(Lexems); 

      } catch (Exception ex) { 
       jLabel2.setText("Error"); 
       Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     } 
    } 
} 

et la fonction à distance

package AlKhalil.ui; 
import java.util.*; 
import java.util.List; 
import AlKhalil.token.*; 
import AlKhalil.analyse.*; 
import AlKhalil.*; 
import AlKhalil.result.*; 


public class Aarib { 

    public Analyzer analyzer; 
    public String myResult=""; 
    public String inputText=""; 

    public Aarib() { 
     Settings settings = new Settings(); 
     analyzer = new Analyzer(); 

    } 

    public String LexicalAnalysis() throws Exception { 

     Thread t = new Thread() 
     { 
      public void run() 
      { 
      //some code 
        ... 
        ... 
        ... 
      } 
     }; 

     t.start(); 
     return myResult; 
    } 
} 

de Merci à l'avance :)

Répondre

0

La solution est d'attendre le résultat produit dans le fil t. Avec votre code actuel, vous démarrez un thread concurrent et renvoyez instantanément l'attribut myResult. Avec le second clic sur votre bouton, le myResult est (la plupart du temps) rempli par le thread et retourné après le démarrage d'un autre thread concurrent effectuant le calcul.

Je suggère d'envisager une sorte de modèle Observer pour votre programme. Votre interface graphique doit alors observer le thread de calcul et être averti d'un résultat qui sera ensuite traité.

Mais comme nous ne pouvons pas tous voir le code exécuté dans le thread et que vous attendez la fin du thread, pourquoi ne pas simplement utiliser un thread.

+0

Merci de nous aider :) J'ai ajouté cette while (t.isAlive()) {} avant retour myResult; et cela a fonctionné :) – user2090737

+0

@ user2090737 Alors, quel est le point de démarrage d'un thread? – blank