tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
1
ZUGRIFFE
789
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ulki ulki ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    103
    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

    Hier der Code für das Fenster:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    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
     

  2. #2
    ulki ulki ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    103
    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
     

Ähnliche Themen

  1. JList wird nicht immer angezeigt
    Von Larrywayn im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 5
    Letzter Beitrag: 21.07.09, 19:06
  2. Problem Swing: Contentpane wird nicht immer angezeigt
    Von bk99 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 13.03.09, 11:44
  3. AWT Fensterinhalt wird nicht immer angezeigt
    Von raptot im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 16.05.08, 12:46
  4. Thread-Problem in Swing: Fenster wird nur unvollständig angezeigt
    Von henning-malaysia im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 07.11.06, 14:45
  5. Batterie Status wird nicht angezeigt Win2000
    Von Gudy im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 14.02.04, 13:56