2011-08-29 5 views
6

Sto convertendo un'applicazione console in uno che utilizza Swing. Al momento voglio che il mio programma faccia una cosa simile a questo .nextInt(); come posso ottenere questo utilizzando .getText(); o qualcosa di simile?Come attendere l'immissione in un campo di testo?

In breve;

Come posso sospendere l'esecuzione del programma finché l'utente non ha inserito qualcosa nel campo di testo e ha premuto invio.

+0

ancora non capisco la domanda - cosa intendi per "mantenere l'esecuzione"? A parte questo: leggi un'esercitazione di base di Swing e l'api doc di textfield (suggerimento: setAction potrebbe valerne la pena :-) – kleopatra

risposta

5

Aggiornamento: Quindi si desidera che l'utente inserisca qualcosa dalla GUI. Questo è possibile ma deve essere sincronizzato poiché la GUI viene eseguita in un altro thread.

Quindi i passaggi sono:

  1. Creare un oggetto "supporto" che deligates il risultato dalla GUI a filo "logica"
  2. la "logica" thread attende per l'ingresso (usando holder.wait())
  3. Quando l'utente ha inserito il testo, sincronizza l'oggetto "titolare" e fornisce il risultato + notifica il thread "logico" (con holder.notify())
  4. Il thread "logico" viene rilasciato dal blocco e continua.

esempio completa:

public static void main(String... args) throws Exception { 
    final List<Integer> holder = new LinkedList<Integer>(); 

    final JFrame frame = new JFrame("Test"); 

    final JTextField field = new JTextField("Enter some int + press enter"); 
    frame.add(field); 
    field.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      synchronized (holder) { 
       holder.add(Integer.parseInt(field.getText())); 
       holder.notify(); 
      } 
      frame.dispose(); 
     } 
    }); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 

    // "logic" thread 
    synchronized (holder) { 

     // wait for input from field 
     while (holder.isEmpty()) 
      holder.wait(); 

     int nextInt = holder.remove(0); 
     System.out.println(nextInt); 
     //.... 
    } 
} 
+0

Controlla la domanda aggiornata. – Derek

+0

@Deza: aggiornato con l'esempio completo .. – dacwe

+1

Quasi 6 anni dopo, grazie !! Grande esempio. – DCON

0

applicazione console e applicazioni GUI sono molto diverse nel comportamento. L'applicazione della console riceve input dagli argomenti della riga di comando o attende l'input immesso dall'utente dalla tastiera mentre l'applicazione GUI è guidata dal meccanismo degli eventi per eseguire un'attività.

Ad esempio, si aggiunge un oggetto TextField al frame e si aggiunge un keyListener all'oggetto campo di testo. Il listener viene richiamato quando l'evento chiave è stato notificato. Ci sono molti esempi là fuori, ad es. esempio java ufficiale http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html

Problemi correlati