JProgressBar und NullPointerException

Status
Nicht offen für weitere Antworten.

Froop

Mitglied
Hallo zusammen,

ich rufe eine Aktion auf, die schon einige Sekunden benötigt. Damit es dem Benutzer nicht allzu langweilig wird, lasse ich eine simple ProgressBar hin- und herwandern. Diese zeigt nicht die Restzeit an, sondern dient nur zum Zeigen, dass die Anwendung noch lebt.

Hier mein Aufbau:

Klasse1
public static JProgressBar probar;
Thread starten

Threadklasse
Klasse1.probar.setIndertimate(true);
Aktion laufen lassen
Klasse1.probar.setIndertimate(false);

Meine Klasse1 startet den Thread. Dieser lässt dann erst einmal den Balken tanzen, ruft dann die Aktion auf und wenn diese beendet ist, wird der Balken wieder ausgeblendet.

Dies alles funktioniert in der Regel ganz gut. Sporadisch bekomme ich aber die folgende NullPointerException:

  • java.lang.NullPointerException
    at javax.swing.plaf.basic.BasicProgressBarUI.sizeChanged(Unknown Source)
    at javax.swing.plaf.basic.BasicProgressBarUI.setAnimationIndex(Unknown Source)
    at javax.swing.plaf.basic.BasicProgressBarUI.incrementAnimationIndex(Unknown Source)
    at javax.swing.plaf.basic.BasicProgressBarUI$Animator.actionPerformed(Unknown Source)
    at javax.swing.Timer.fireActionPerformed(Unknown Source)
    at javax.swing.Timer$DoPostEvent.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Mache ich da irgendetwas falsch?
Ich verwende Java 1.4.2 und der Fehler tritt sowohl unter XP als auch unter Linux auf.

Danke schon einmal,
Froop
 
Wenn du
Code:
public static JProgressBar probar;
schreibst dann zeigt die Referenz probar auf null.

Du musst sie erst zuweisen:

Code:
public static JProgressBar probar = new JProgressBar();

Gruß,
nocxsville.
 
Vielen Dank für deine Antwort nocxsville,

um das ganze übersichtlicher zu machen, habe ich die Initialisierungen nicht aufgeführt.

Hier sind sie nun:

  • probar = new JProgressBar();
    probar.setOrientation(JProgressBar.HORIZONTAL);
    probar.setVisible(true);
    probar.setBackground(java.awt.Color.lightGray);
    probar.setForeground(java.awt.SystemColor.textHighlight);
    probar.setName("probar");
    probar.setModel(defaultBoundedRangeModel);
    probar.setBorderPainted(true);


Wie ich schon erwähnte, funktioniert die Sache einige Male tadellos und dann wird die Exception plötzlich ausgelöst.

Kann es sich vielleicht um einen Bug in Java selbst handeln?

Grüße,
Froop
 
Wenn du direkt aus einem Thread auf eine GUI-Komponente zugreiffst, kannst du sie durcheinander bringen. Zugriffe auf die GUI müssen (fast) immer über den Event-Dispatcher-Thread ausgeführt werden:
Code:
// in einem Thread oder Runnable:
public void run(){
  EventQueue.invokeLater( new Runnable(){
    public void run(){
      probar.setIntermediate( true );
    }
  });

  [...] // Thread-Zeugs abarbeiten

  EventQueue.invokeLater( new Runnable(){
    public void run(){
      probar.setIntermediate( false );
    }
  });
}
 
Hi Beni,

herzlichen Dank. Das klappt jetzt prima.

Dass die meisten Swing Elemente nicht threadsicher sind, habe ich schon gehört. Zum Teil konnte ich meine Funktion 30 Mal ohne Fehlermeldung auffrufen. Ich hätte bei einem solchen Problem mit deutlich häufigeren Problemen gerechnet. Na ja, so scheinen die Threads nun mal zu sein.

Grüße,
Froop
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben