2014-07-22 2 views
0

J'écris un programme qui a un JFrame avec un JMenu dedans. Une fois que l'utilisateur clique sur un élément de menu, un JDialog est appelé pour obtenir une chaîne de l'utilisateur. Je veux utiliser cette chaîne dans mon programme principal mais je ne sais pas comment retourner cette valeur du JFrame au programme principal (j'ai réussi à retourner la valeur de JDialog au JFrame). Des idées?renvoie une valeur d'un JFrame à main()

Mon principal ::

public static void main(String[] args) 
{ 
    myFirstFrame m = new myFirstFrame(); 

    m.setVisible(true); 

    String localhost = m.getLh(); 

    System.out.println(localhost); 
} 

Mon JFrame ::

public class myFirstFrame extends JFrame 
{ 
    String lh; 

    myDialog myD; 

    public myFirstFrame(JFrame mf) 
    { 
     super(); 
     setTitle("Welcome"); 
     setSize(300, 300); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

     JMenuItem playg = new JMenuItem("Play game"); 
     simetoxi.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent ae) 
      { 
       myD = new myDialog(myFirstFrame.this); 
       myD.setVisible(true); 

       String lh = myD.getText(); 
       System.out.println(lh + "ASasASas"); 
       dispose(); 
      } 

     }); 

     JMenu game = new JMenu("GAME"); 
     game.add(playg); 
     JMenuBar myBar = new JMenuBar(); 
     myBar.add(game); 
     setJMenuBar(myBar); 
    } 

    public String getLh() 
    { 
     return lh; 
    } 
} 

Mon JDialog ::

public class myDialog extends JDialog 
{ 
    JTextField t1; 

    String sname; 

    public myDialog(JFrame fr) 
    { 
     super(fr, true); 
     setTitle("Connect"); 
     setSize(200, 200); 
     setLayout(new FlowLayout()); 
     JLabel l1 = new JLabel("Give the server name"); 
     t1 = new JTextField(15); 
     add(l1); 
     add(t1); 
     JButton okb = new JButton("submit"); 
     okb.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent ae) 
      { 
       sname = t1.getText(); 
       dispose(); 
      } 
     }); 
     add(okb); 
    } 

    public String getText() 
    { 
     return sname; 
    } 
} 
+0

g application comme spécifié ici en tant que démarrage de l'application: http://www.javamex.com/tutorials/threads/invokelater.shtml alors vous n'avez pas besoin de communiquer avec la fonction main(), tout ce qui est à partir de ce point est le JFrame et son la responsabilité des enfants. – EpicPandaForce

Répondre

2

Le problème est que lorsque main crée le Frame, il n'arrête pas et attend que la valeur soit disponible avant d'exécuter le reste de la fonction main.

Il existe plusieurs façons de résoudre ce problème. Par exemple, plutôt que de mettre System.out.println(localhost) dans main, vous pouvez le mettre dans une méthode différente. Ensuite, dans le Frame, appelez cette méthode lorsque vous obtenez la valeur.

Si vous voulez vraiment mettre cet appel dans main, vous devrez trouver un moyen de faire main bloquer jusqu'à ce que la valeur est disponible. Par exemple, vous pouvez créer un BlockingQueue et essayer de supprimer la valeur de main. Dans le gestionnaire d'événements Frame, placez la valeur nécessaire dans la file d'attente.

0

La principale méthode ne sera pas attendre votre JFrame de passer par ces étapes, afin d'appeler un getter dans votre programme principal (même si vous « correct »

String lh = myD.getText(); 

à

lh == myD.getText(); 

sera ne fonctionne pas - Transmettez cette information à une classe/méthode qui en fait un bon usage, peut-être en la traitant dans un thread séparé - cela dépend de ce que vous voulez faire avec "localhost"

Questions connexes