|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
[java] strana NullPointerException
Sto realizzando un programmino (abbastanza serio) con le swing. In fase di test ogni tanto salta fuori questa NullPointerException qui sotto (dopo che ho importato un file xml con un thread a parte). Non succede sempre e quando succede puo' saltar fuori una volta sola o anche 3 di fila. Quasi sempre il programma continua a funzionare correttamente ma ogni tanto l'aggiornamento grafico va a farsi benedire mostrando i componenti caricati in maniera orribile.
L'eccezione e': java.lang.NullPointerException at javax.swing.JComponent._paintImmediately(JComponent.java:4846) at javax.swing.JComponent.paintImmediately(JComponent.java:4667) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:477) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:114) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:461) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176) at java.awt.EventDispatchThread.run(EventDispatchThread.java:110) In paintImmediately null graphics Come vedete non ci sono riferimenti a codice del mio package. Cosa puo' essere? E' normale? Grazie ^^ |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Non è normale. Il tuo codice potrebbe avere un bug, forse di concorrenza o forse di gestione del disegno. Bisognerebbe vederlo per capire.
La traccia dice che si trova per le mani un Graphics che vale null. Maneggi per caso qualche Graphics?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#3 | |
|
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
Quote:
Non uso direttamente oggetti Graphics ma quando inserisco nuovi elementi nei pannelli chiamo il repaint() di quest'ultimi. Il caricamento del file xml e la conseguente creazione dei pannelli con le informazioni e' fatto in un thread a parte. Non capisco dove sta il problema :hmm: Ultima modifica di afsdfdlecosdfsfdcco : 25-08-2007 alle 19:47. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
quando crei i pannelli dall'altro thread usi SwingUtilities.invokeLater... vero?
__________________
|
|
|
|
|
|
|
#5 |
|
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Se tu modifichi dei componenti grafici da un thread diverso da quello dell'AWT *potresti* avere dei problemi.. E direi che il tuo caso è piuttosto simile.. Ora.. non conoscendo il codice non posso essere sicuro se sia proprio quello il motivo, cmq prova ad usare il metodo SwingUtilities.invokeLater nel seguente modo quando aggiorni dei componenti grafici dall'altro Thread: Codice:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
this.panel.show();
}
});
__________________
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Tieni conto che repaint() è immune alla questione del Thread EDT. Cioè repaint() puoi invocarlo tranquillamente anche da Thread diversi dall'EDT.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#8 |
|
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
Questo e' il codice del thread:
Codice PHP:
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Se il metodo loadEmoticonSet è eseguito dall'EDT (Event Dispatcher Thread) allora basta togliere il thread ad hoc che hai creato: in pratica metti gli enunciati direttamente nel metodo loadEmoticonSet.
loadEmoticonSet è eseguito dall'EDT se è invocato in reazione ad un evento awt (cioè se la sua invocazione si trova all'interno di un actionPerformed, mousePressed/Released/eccetered, keyPressed.... uno dei metodi che gestisce eventi awt/swing). Altrimenti devi semplicemente prendere le istruzioni che accedono a componenti AWT/Swing proiettabili e darle in pasto all'EDT con l'invokeLater. In quel metodo le istruzioni che accedono a componenti Swing probabilmente proiettabili sono: GUI.statusLabel.setText("loading, please wait"); panel.removeAll(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); add(emoticonPanels.get(i), 0); revalidate(); GUI.mainFrame.pack(); GUI.statusLabel.setText(GUI.openedFile.getName() + " is open"); Per affidarle all'EDT basterebbe dire: Codice:
EventQueue.invokeLater(new Runnable() { public void run() {
GUI.statusLabel.setText("loading, please wait");
panel.removeAll();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
add(emoticonPanels.get(i), 0);
revalidate();
GUI.mainFrame.pack();
GUI.statusLabel.setText(GUI.openedFile.getName() + " is open");
}});
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#10 | |
|
Registered User
Iscritto dal: Jul 2007
Messaggi: 915
|
Quote:
grazie, dopo provo ^^ |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:37.




















