Status Fenster wird nicht immer angezeigt

ulki

Erfahrenes Mitglied
Hi!

Ich versuche einen langen Ladevorgang für den Benutzer durch ein Statusfenster deutlich zu machen.
Mittlerweile laufen meine Threads vernünftig und auch das Fenster das den Statusbalken anzeigen soll erscheint. Aber leider ist es in den meisten Fällen vollkommen leer. Nur der Titel ist zu lesen.
Als die Threads noch nicht richtig liefen, es wurden mehrere Status Fenster geöffnet, liefen alle bis auf das erste Fenster richtig und zeigten an was sie sollten.
Leider habe ich keine Idee woran es liegen könnte. Für Hilfe wäre ich echt dankbar :rolleyes:

Hier der Code für das Fenster:

Code:
import java.util.*;

public class StatusBar extends javax.swing.JFrame {
    
    private Thread calling = new Thread();
    
    /** Creates new form StatusBar */
    public StatusBar() {
        initComponents();
        progress.setIndeterminate(true);
    }
    
    public StatusBar(Thread t) {     
        initComponents();
        calling = t;
        progress.setIndeterminate(true);
    }
    
    private void initComponents() {                          
        center = new javax.swing.JPanel();
        progress = new javax.swing.JProgressBar();
        north = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        south = new javax.swing.JPanel();
        cancel = new javax.swing.JButton();
        east = new javax.swing.JPanel();
        west = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Tabelle wird geladen");
        setResizable(false);
        center.setLayout(new javax.swing.BoxLayout(center, javax.swing.BoxLayout.X_AXIS));

        center.add(progress);

        getContentPane().add(center, java.awt.BorderLayout.CENTER);

        jLabel1.setText("Bitte haben Sie einen Moment Geduld");
        north.add(jLabel1);

        getContentPane().add(north, java.awt.BorderLayout.NORTH);

        cancel.setText("Abbrechen");
        cancel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelActionPerformed(evt);
            }
        });

        south.add(cancel);

        getContentPane().add(south, java.awt.BorderLayout.SOUTH);

        getContentPane().add(east, java.awt.BorderLayout.EAST);

        getContentPane().add(west, java.awt.BorderLayout.WEST);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300);
    }                        

    private void cancelActionPerformed(java.awt.event.ActionEvent evt) {                                       
        setVisible(false);
        dispose();
    }                                      
    
    
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton cancel;
    private javax.swing.JPanel center;
    private javax.swing.JPanel east;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel north;
    private javax.swing.JProgressBar progress;
    private javax.swing.JPanel south;
    private javax.swing.JPanel west;
    // End of variables declaration                   
    
}


Und hier ein Beispiel eines typischen Aufrufs:

Code:
Runnable fillingCSTable = new Runnable()
           {
             public void run() 
             {
               if(opened == false)  // um zu verhindern das mehr als ein Fenster geöffnet wird
               {
                showing  = new StatusBar();  
                showing.setVisible(true);
                opened = true;
               } 
               
               TableContent inside = receiver.getCSTable(thisone.getCIMInstance()); //Tabelle laden
               
               Vector content1 = new Vector();
               Vector title1   = new Vector();
               String caption1 = "";
               try
                {
                   content1 = inside.getContent();
                   title1   = inside.getTitle();
                   caption1 = inside.getCaption();
                }
              catch(Exception e)
               {
                  System.out.println("leere Tabelle");
               }
              if(oneoftwo == 1)
              {   
                fillContentInCIMComp(content1, title1,caption1);  //bis hier aufbereiten der Tabelle für die Anzeige
               
                showing.setVisible(false);
                showing.dispose();
                opened = false;
                
                Cursor point = new Cursor(0);
                getContentPane().setCursor(point);
              }
              else
              {
                fillContentInComputersystems(content1, title1, caption1);
                tableComputersystem.changeSelection(row , row, false, false);
       
                tableComputersystemMouseClicked(evt);
              }   
             }  
           };

Das Runnabel wird mit SwingUtilities.invokeLater(fillingCSTable); aufgerufen. In einer Methode, die von einem Eventhandler aufgerufen wird.

Mich verwirrt vor allem, das es manchmal klappt und manchmal nicht.

Hoffe sehr auf eure Hilfe

ulki ;)
 
Hi,

Problem gefunden:

Da die GUI auf einen Rückgabewert wartet konnte sie sich nicht aktualisieren. Darum wurde das Fenster nicht ordentlich angezeigt. Habe das jetzt geändert.
(eine kleine Methode die aufgerufen wird wenn der Vorgang des Ladens beendet ist)

Danke fürs lesen und nachdenken

ulki
 
Zurück