Fehler in ungeändertem Bereich

Hallo!

Ich glaube du manipulierst die Swing GUI von einem anderen Thread aus als dem Event Dispatch Thread, was nicht erlaubt ist.

Arbeite an diesen Stellen besser mit SwingUtilities.invokeLater(Runnable run)....

Gruß Tom
 
Mhh..... Könnte schon sein das du recht hast.

Die Ereignisabfolge ist ja so:

  • In der GUI wird ein Klick-Event ausgelöst
  • Dann wird über das Interface eine Anfrage nach MainClass geschickt
  • Darauf startet MainClass den Thread....
  • .... der Thread holt die Tabelle und gibt sie nach Main über das TableObjekt
  • dort wird es für die GUI aufbereitet und zurückgegeben

Ich glaube die Ursache für den Fehler ist, dass in der while-Schleife versucht wird den Thread mehr als einmal zu starten. Hier was ich im Netz gefunden habe:

public void start( ) Der Aufruf der Methode start( ) überführt einen Thread vom Zustand „new“ in den Zustand „ready-to-run“. Wurde der Thread schon einmal gestartet, so wird eine IllegalThreadStateException geworfen.

Wäre immerhin möglich.

Mal schauen wie sowas mit dem funktioniert was du gerade vorgeschlagen hast. Ist sicher sauberer als meine Versuche. :p
 
Das klinkt wirklich gar nicht so schlecht.
Nun stellt sich mir noch die Frage, ob ich von dieser Methode trotzdem Code in anderen Klassen aufrufen kann. Den die Trennung von Steuerung und Anzeige muss erhalten bleiben.

Wenn ihr dazu noch Vorschläge habt wäre ich glücklich. Ich habe damit nämlich noch überhauptnicht gearbeitet. Ich werde jetzt erstmal versuchen, ob ich es mit hilfe des Tutorials hinbekomme. Aber ich habe schon die Erfahrung gemacht, dass im Tutorial wichtige Dinge so versteckt sind, das man sie leicht beim ersten bis zehnten mal lesen übersieht.
 
So an sich funktioniert es schonmal.

Nur leider bekomme ich beim erstenmal keine Tabelle angezeigt, und alle folgenden male die Tabelle, die ich davor haben wollte.

Erst hatte ich gedacht, das ich dieses Problem vieleicht mit .invokeAndWait lösen könnte, aber das darf ich von dort wo ich arbeite nicht aufrufen.

Hier mal mein Code:

Code:
public TableContent callInstanceTable(Vector element)
    {
       final Vector vectorsend = element; 
        
      //Runnable for thread--------------------------------------------------------------------- 
           Runnable fillingInstanceTable = new Runnable()
           {
             public void run() {
                 showing.setVisible(true);
                 
                 haveSet = false; 
                 try{
                 tableobject.setContent(receiver.getInstanceTable(vectorsend.elements()));
                 }
                 catch(Exception e)
                 {JOptionPane.showMessageDialog(null, e.toString(), "Fehler", JOptionPane.ERROR_MESSAGE);}
                 haveSet = true;
                 
                 showing.setVisible(false);
                 showing.dispose();             //eliminating the statuswindow
             }  
           };
         //Runnable end----------------------------------------------------------------------------
           
          try{
               SwingUtilities.invokeLater(fillingInstanceTable);
             }
          catch(Exception e)
          {}
           
          return tableobject.getContent();
    }

callInstanceTable wird aus einem EventHandler heraus aufgerufen.

Ich denke das erst eine NullPointerException kommt liegt daran, das die Variable tableobject noch nicht gefüllt ist, wenn er versucht sie anzuzeigen (beim zurückgeben von tableobject.getContent() wird einfach nichts zurückgegeben).

Wie schaffe ich es nun, das erst zurückgegeben wird, wenn tableobject auch gefüllt ist?

Langsam wachsen mir graue Haare, besonders da ich nebenbei auch noch bei der GUI Gestalltung mitarbeite und für vier Klausuren lerne.
 
So jetzt läuft er.
Habe hier jemanden gefunden der mal schnell drübergeschaut und mit dem Finger auf den Fehler gezeigt hat.

Jetzt sind nur noch ein paar kleinere Sachen zu verbessern (zum Beispiel das Statusfenster).

Hier die Version die tut was sie soll:

Code:
public void callInstanceTable(Vector element)
    {
       final Vector vectorsend = element; 
        
      //Runnable for thread--------------------------------------------------------------------- 
           Runnable fillingInstanceTable = new Runnable()
           {
             public void run() {
                 showing.setVisible(true);
                 
                 haveSet = false; 
                 try{
                 tableobject.setContent(receiver.getInstanceTable(vectorsend.elements()));
                 }
                 catch(Exception e)
                 {JOptionPane.showMessageDialog(null, e.toString(), "Fehler", JOptionPane.ERROR_MESSAGE);}
                 haveSet = true;
                 
                 showing.setVisible(false);
                 showing.dispose();             //eliminating the statuswindow
                 
                 showTable(tableobject.getContent());
             }  
           };
         //Runnable end----------------------------------------------------------------------------
           
          try{
               SwingUtilities.invokeLater(fillingInstanceTable);
             }
          catch(Exception e)
          {}       
    }

Danke für Hilfe und Anregungen. Wenn mal wieder was nicht so will wie ich frage ich euch wieder ;)
 
Zurück