JProgressBar ohne Threads verwenden

Status
Nicht offen für weitere Antworten.

roddy

Aktives Mitglied
Guten Morgen,

ich weiss dass es eine FAQ zu JProgressBars gibt, aber die verwendet Multithreading, das hab ich mir noch nicht angelesen bzw. verstehe ich noch nicht und deshalb wüsste ich gerne

a) ob es (in meinem Fall) nicht auch ohne Multithreading geht
b) wo mein Fehler ist

Es geht mir momentan darum, dass mehrere Dateien nacheinander in einer for-Schleife per StreamTokenizer eingeladen werden. Das ganze soll per JProgressBar dargestellt werden. Mein (entsprechend gekürzter) Code sieht wie folgt aus:

Code:
        final JFrame RRprogframe = new JFrame("RVstat05 - Einlesen der Erhebungsdaten");
        RRprogframe.setSize(320,240);
        RRprogframe.setLocationRelativeTo(null);      
        RRprogframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JLabel proginfo = new JLabel("Daten werden eingelesen...");
        JProgressBar RRprogress = new JProgressBar(JProgressBar.HORIZONTAL,0,filename.length);
        RRprogress.setValue(0);
        RRprogress.setStringPainted(true);
        RRprogress.setString("");
        ActionListener proglistener = new ActionListener(){ public void actionPerformed(ActionEvent e){
            RRprogframe.dispose();
        }
        };
        JButton RRprogbutton = new JButton("OK");
        RRprogbutton.addActionListener(proglistener);
        RRprogbutton.setEnabled(false);
        
        GridBagLayout RRprogGBL = new GridBagLayout();
        
        RRprogGBL.addLayoutComponent(proginfo, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
        RRprogGBL.addLayoutComponent(RRprogress, new GridBagConstraints(0,1,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,5,0,5),0,0));
        RRprogGBL.addLayoutComponent(RRprogbutton, new GridBagConstraints(0,2,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
        
        JPanel progpanel = new JPanel(RRprogGBL);
        progpanel.add(proginfo);
        progpanel.add(RRprogress);
        progpanel.add(RRprogbutton);
        
        RRprogframe.getContentPane().add(progpanel);
        
        RRprogframe.setVisible(true);

        for (int file = 0; file<filename.length; file++){
        // StreamTokenizer liest eine Datei ein ...
        RRprogress.setValue(file+1);
        String purefilename = filename[file];
        int slash = purefilename.lastIndexOf(System.getProperty("file.separator"));
        purefilename = purefilename.substring(slash+1,purefilename.length());
        RRprogress.setString(purefilename + " eingelesen.");
        }
        RRprogbutton.setEnabled(true);

Der Gedanke (bzw. meine Hoffnung) ist, dass ich keinen Timer und nichts brauche und somit das ganze ja auch ohne Multithreading gehen könnte (denk ich mir mal so *g*). Mein Problem ist nun, dass zwar mein JFrame erscheint, aber das Label, der Button und die ProgressBar erst im Fenster erscheinen, wenn die For-Schleife komplett durchlaufen ist. Ich sehe also nur einen vollen Fortschrittsbalken mit dem String "LetzteDatei eingelesen" und vorher ein leeres Fenster. Kann mir da jemand helfen?
 

Düark

Aktives Mitglied
Das liegt wohl daran, daß deine Schleife die GUI blockiert, d.h. die Schleife wird abgearbeitet und danach findet die VM erst wieder Zeit für den Progress-Bar.
Deswegen wirst Du um Threads nicht herumkommen, aber so schlimm wie es anfangs scheint, sind sie gar nicht!

Gruss

Dirk
 
F

Flash0r

Gast
Ich würde mal sagen du hast vergessen deine Bar zu aktualisieren, versuchs mal damit:

Rectangle progressRect =RRprogress.getBounds();
progressRect.x = 0;
progressRect.y = 0;
RRprogress.paintImmediately( progressRect );

Btw, ProgressBars gehen auch ohne Threads.
Gruß
Flash
 

roddy

Aktives Mitglied
Wo müssten diese Befehle hin? Hab sie jetzt mal zur Initialisierung der ProgressBar geschrieben (Zeile 11), aber das ändert nichts am Problem.
 
F

Flash0r

Gast
In deine For Schleife, du willst ja immer deine Bar aktualisieren wenn ein File geladen wurde.
 

roddy

Aktives Mitglied
Code:
    public progPlausibility(JFrame daddy, Vehicle[] data){
        super(daddy,"Plausibilitätsprüfung");
        
        db = data;
        
        test0 = new JLabel("<html><font color=blue>[b]TEST 1:[/b]</html>");
        test0bar = new JProgressBar(JProgressBar.HORIZONTAL,0,data.length);
        test0bar.setValue(0);
        test0bar.setStringPainted(true);
        test0bar.setString("0 %");
        
        test1 = new JLabel("<html><font color=red>[b]TEST 2:[/b]</html>");
        test1.setMaximumSize(new Dimension(160,200));
        test1bar = new JProgressBar(JProgressBar.HORIZONTAL,0,data.length);
        test1bar.setValue(0);
        test1bar.setStringPainted(true);
        test1bar.setString("0 %");
        
        test2 = new JLabel("<html><font color=red>[b]TEST 3:[/b]</html>");
        test2.setMaximumSize(new Dimension(160,200));
        test2bar = new JProgressBar(JProgressBar.HORIZONTAL,0,data.length);
        test2bar.setValue(0);
        test2bar.setStringPainted(true);
        test2bar.setString("0 %");
        
        test3 = new JLabel("<html><font color=red>[b]TEST 4:[/b]</html>");
        test3.setMaximumSize(new Dimension(160,200));
        test3bar = new JProgressBar(JProgressBar.HORIZONTAL,0,data.length);
        test3bar.setValue(0);
        test3bar.setStringPainted(true);
        test3bar.setString("0 %");
        
        test4 = new JLabel("<html><font color=red>[b]TEST 5:[/b]</html>");
        test4.setMaximumSize(new Dimension(160,200));
        test4bar = new JProgressBar(JProgressBar.HORIZONTAL,0,data.length);
        test4bar.setValue(0);
        test4bar.setStringPainted(true);
        test4bar.setString("0 %");
        
        userGBL = new GridBagLayout();
        userspace = new JPanel(userGBL);
        
        backbutton = new JButton("Zurück");
        backbutton.addActionListener(this);
        
        forwardbutton = new JButton("Weiter");
        forwardbutton.addActionListener(this);
        forwardbutton.setEnabled(false);
        
        GridBagLayout myGBL = new GridBagLayout();
        setLayout(myGBL);
        
        myGBL.addLayoutComponent(test0, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,0,2,0),0,0));
        myGBL.addLayoutComponent(test1, new GridBagConstraints(1,0,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,0,2,0),0,0));
        myGBL.addLayoutComponent(test2, new GridBagConstraints(2,0,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,0,2,0),0,0));
        myGBL.addLayoutComponent(test3, new GridBagConstraints(3,0,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,0,2,0),0,0));
        myGBL.addLayoutComponent(test4, new GridBagConstraints(4,0,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,0,2,0),0,0));
        myGBL.addLayoutComponent(test0bar, new GridBagConstraints(0,1,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,2,5,2),0,0));
        myGBL.addLayoutComponent(test1bar, new GridBagConstraints(1,1,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,2,5,2),0,0));
        myGBL.addLayoutComponent(test2bar, new GridBagConstraints(2,1,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,2,5,2),0,0));
        myGBL.addLayoutComponent(test3bar, new GridBagConstraints(3,1,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,2,5,2),0,0));
        myGBL.addLayoutComponent(test4bar, new GridBagConstraints(4,1,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,2,5,2),0,0));
        myGBL.addLayoutComponent(userspace, new GridBagConstraints(0,2,5,1,100,100,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,2,5,2),0,0));
        myGBL.addLayoutComponent(backbutton, new GridBagConstraints(0,3,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,5,0),0,0));
        myGBL.addLayoutComponent(forwardbutton, new GridBagConstraints(4,3,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,5,0),0,0));
        
        getContentPane().add(test0); getContentPane().add(test1); getContentPane().add(test2); getContentPane().add(test3); getContentPane().add(test4);
        getContentPane().add(test0bar); getContentPane().add(test1bar); getContentPane().add(test2bar); getContentPane().add(test3bar); getContentPane().add(test4bar);
        getContentPane().add(userspace);
        getContentPane().add(backbutton); getContentPane().add(forwardbutton);
        
        setSize(800,600);
        setResizable(false);
        setLocationRelativeTo(daddy);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(this);
        setModal(false);
        
        setVisible(true);
        
        kickOffTest0();
    }
    
    private void kickOffTest0(){
        for (int i = 0; i<db.length; i++){
            if (i%10 == 0){
                double prozent = (100*i) / db.length;
                test0bar.setString(prozent + " %");
                test0bar.setValue(i);
                repaint(test0bar);
            }
            // TEST SOMETHING
        }
            JLabel showuser = new JLabel("TESTERGEBNIS");
            userspace.add(showuser);
            repaint(userspace);
            test0.setText("<html><font color=green>[b]TEST 1:[/b] 
[i](...abgeschlossen...)[/i]</font>");
            repaint(test0);
            test0bar.setValue(test0bar.getMaximum());
            test0bar.setString("100 %");
            repaint(test0bar);
            test1bar.setMaximum(res.size());
            repaint(test1bar);
    }
    
    private void repaint(JPanel topaint){
        Rectangle rect = topaint.getBounds();
        rect.x = 0;
        rect.y = 0;
        topaint.paintImmediately(rect);
        this.validate();
    }
    
    private void repaint(JProgressBar topaint){
        Rectangle rect = topaint.getBounds();
        rect.x = 0;
        rect.y = 0;
        topaint.paintImmediately(rect);
        this.validate();
    }
    
    private void repaint(JLabel topaint){
        Rectangle rect = topaint.getBounds();
        rect.x = 0;
        rect.y = 0;
        topaint.paintImmediately(rect);
        this.validate();
    }

In diesem Code hab ich das in diesem Thema hier aufgezeigte Prinzip angewandt. Allerdings habe ich Probleme mit der Darstellung. Es sollte so sein (bzw. so wünsche ich es mir), dass zuerst die Test-Labels und die leere ProgressBars gemalt werden, dann der erste Test losgeht und die erste ProgressBar aktualisiert wird. Ich hatte das auch mal so, habe keine Ahnung, was ich geändert hab setidem, jedenfalls jetzt ist es nicht mehr so. Ich sehe in meinem Fenster nur die erste ProgressBar, wie sie anwächst (und die Prozentzahlen korrekt aktualisiert werden) und wenn der erste Test fertig ist, werden erst die anderen ProgressBars, Labels, Buttons etc. angezeigt. Sieht jemand einen Fehler, den ich hierbei mache? Oder kann das aus irgendeinem Grund auf diese Art und Weise gar nicht funktionieren?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Repaint bei JProgressBar AWT, Swing, JavaFX & SWT 3
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
H JProgressBar in TableColumn von JTable setzen/abfragen AWT, Swing, JavaFX & SWT 5
B JProgressBar: wie muss ich das lösen? AWT, Swing, JavaFX & SWT 4
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
G JProgressbar AWT, Swing, JavaFX & SWT 8
A JProgressBar: Farbe im Windows Look&Feel ändern. AWT, Swing, JavaFX & SWT 1
C JProgressBar und ihre Tücken AWT, Swing, JavaFX & SWT 8
G JProgressBar in JTable AWT, Swing, JavaFX & SWT 6
G Probleme mit JProgressbar auf JPanel in JFrame AWT, Swing, JavaFX & SWT 6
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
T JProgressBar und CMP Bean AWT, Swing, JavaFX & SWT 2
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
L JProgressbar möglichst genau AWT, Swing, JavaFX & SWT 3
G JProgressBar + Thread + Client AWT, Swing, JavaFX & SWT 10
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G JProgressBar AWT, Swing, JavaFX & SWT 8
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
U JProgressBar in umgekehrter Richtung AWT, Swing, JavaFX & SWT 2
S JProgressBar einbinden AWT, Swing, JavaFX & SWT 5
H JProgressBar AWT, Swing, JavaFX & SWT 6
T JProgressBar und JPG AWT, Swing, JavaFX & SWT 2
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
M KeyEvent ohne Fokus konsumieren AWT, Swing, JavaFX & SWT 1
Georges456 NetBeans am Mac leider ohne FXML AWT, Swing, JavaFX & SWT 17
A JOptionPane OK ohne Eingabe abfangen AWT, Swing, JavaFX & SWT 10
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
N setOnKeyPressed ohne Scene AWT, Swing, JavaFX & SWT 2
M mvvm umsetzen ohne fxml AWT, Swing, JavaFX & SWT 0
L JavaFX OpenJFX16 App ohne Gradle and Maven? AWT, Swing, JavaFX & SWT 2
izoards Jar startet jedoch ohne Hintergrundfunktion AWT, Swing, JavaFX & SWT 25
L FX-Projekt: fast leere Fensterausgabe ohne Fehlermeldung AWT, Swing, JavaFX & SWT 6
H Timer ohne alles lahmzulegen? AWT, Swing, JavaFX & SWT 2
Z Random Butten erstellen ohne Container AWT, Swing, JavaFX & SWT 15
VPChief Ein JFrame ohne setUndecorated(true); nicht verschiebbar machen. AWT, Swing, JavaFX & SWT 6
Fiedlerdan Vergleich vieler Strings ohne ellenlange Argumentierten AWT, Swing, JavaFX & SWT 7
L Daten bearbeiten ohne GUI zu blockieren - daten haltung/zurück geben AWT, Swing, JavaFX & SWT 15
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
K JFreeChart nicht ohne BarChartDemo startklar? AWT, Swing, JavaFX & SWT 5
GenerationLost JavaFX FileChooser speichern ohne Zieldatei? AWT, Swing, JavaFX & SWT 12
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
M Menü ohne Menübar umsetzen[SWT] AWT, Swing, JavaFX & SWT 8
kilopack15 Buttons ohne Funktion AWT, Swing, JavaFX & SWT 2
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
Ghostman1711 Java JFormattedTextfield MaskFormatter ohne Leerzeichen AWT, Swing, JavaFX & SWT 3
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
C Jframe ohne Rahmen AWT, Swing, JavaFX & SWT 3
R JavaFX Wert einer ChoiceBox bekommen ohne Lambdas AWT, Swing, JavaFX & SWT 11
Fishmeaker Shortcuts ohne ALT zuweisen AWT, Swing, JavaFX & SWT 1
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
F Swing JPanels übereinander ohne Mananger AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben