Domanda

Ho creato un programma GUI java e ho aggiunto una jList su quella GUI in modo da stampare l'output del programma su quella jList aggiungendo un elemento chiamando

listBox.addElement(""); // where listBox is an instance of jList

Ma il problema è che gli articoli non vengono visualizzati al momento dell'aggiunta. Vengono mostrati quando il programma sta per terminare.

Significa che sto avviando il programma facendo clic su " Start " e quindi l'intera elaborazione viene eseguita inclusa l'aggiunta di elementi al "listBox" ma gli elementi sono mostrati nella jList quando il programma ritorna a " actionPerformed () " metodo di ActionListener di " Start " pulsante.

Cosa si può fare per mostrare istantaneamente gli elementi quando vengono aggiunti all'elenco.

L'applicazione sopra è multithread. Il thread principale avvia la GUI e quindi avvia 10 thread e passa " listModel " (istanza di DefaultListModel) della jList a tutti i thread in modo che ciascun thread possa aggiungere elementi all'elenco chiamando il " addElement (" ") " metodo su " listModel "

In realtà, listModel è un'istanza di una sottoclasse (DefaultListModelSubClass) di classe DefaultListModel. Ho ignorato il metodo addElement () per renderlo " sincronizzato " in modo che contemporaneamente un solo thread possa aggiungere un elemento a questo.

È stato utile?

Soluzione

Probabilmente stai tentando di eseguire l'elaborazione nel Event Dispatching Thread , il thread che gestisce gli aggiornamenti della GUI. L'elaborazione sta bloccando l'aggiornamento della GUI e, al termine dell'elaborazione, si propagano le modifiche della GUI corretta. Per farlo funzionare, dovrai eseguire la tua elaborazione in un thread separato e comunicare con EVT se necessario. SwingWorker sarà il modo migliore per farlo, se hai Java 6 disponibile.

Altri suggerimenti

Tutta la riverniciatura e l'elaborazione degli eventi viene eseguita sul thread di invio eventi AWT (EDT). Se così non fosse, allora ti occuperesti del multithreading, e questo non è molto pratico per una GUI.

La soluzione è eseguire l'elaborazione dei blocchi in un altro thread. Aggiorna la GUI eseguendo il codice sull'EDT con java.awt.EventQueue.invokeLater . Poiché questo è multithread, devi stare molto attento. In particolare il consiglio comune è quello di preferire l'immutabilità per gli oggetti trasferiti tra i fili, in modo da evitare di doverli bloccare. Usa anche alcuni lucchetti ampi rispetto a molti piccoli, ma fai attenzione ai callback.

Evita SwingWorker . Rende le demo brevi. Tuttavia, per il codice di produzione impone una progettazione in cui la GUI e la non-GUI sono strettamente collegate.

Questo è ciò che accade

click
   |
   -----> ActionPerformed
              |
              ---------------->  Fill the list 
                                        |    for each item 
                                        --------------------> jlist.addElement()
              |
              ----------------> paint the jlist

Indirettamente stai invocando il metodo paint quando termina il riempimento dell'elenco.

Se vuoi ottenere risultati prima, devi colorare l'elenco mentre aggiungi elementi ad esso.

L'uso di SwingWorker come menzionato da Stefan Kendall ti consentirà di farlo.

In termini generali, ciò che fai è utilizzare contemporaneamente un altro thread per l'elenco "riempi " che di volta in volta raccontano la "pittura" thread per aggiornare la GUI

click
   |
   -----> ActionPerformed
              |
              ---------------->  Fill the list 
                                        |    for each item 
                                        --------------------> jlist.addElement()
                                             |
                                             | ( in other thread ) 
                                             ----> paint the list ( with the element so far ) 

              |
              ----------------> paint the jlist 

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top