JProgressBar flackert

Status
Nicht offen für weitere Antworten.

jensr

Mitglied
Hallo,

ich habe eine GUI Klasse in der ich die gesamte Oberfläche erzeuge.
Bei einem Klick auf einen bestimmten Button wird eine Funktion aus
einer anderen Klasse aufgerufen, welche einen Array zurückgibt.
In der Zeit wo der Array gefüllt wird, möchte ich eine JProgressBar anzeigen
lassen. Das funktioniert auch wunderbar, aber leider flackert die JProgressbar.
Woran kann das liegen?

In der von der GUI aufgerufenen Funktion wird die JProgressbar so gesetzt:

Code:
GUI.parseProgressBar.setMaximum(filenames.length);
for (i = 0; i < filenames.length; i++) {
   GUI.parseProgressBar.setValue(i+1);
   //enforce painting the progress bar immediatly
   GUI.parseProgressBar.paint(GUI.parseProgressBar.getGraphics());
}
 

jensr

Mitglied
Glaube nicht, woran erkenne ich AWT-Komponenten?
Ich habe bisschen geschummelt, habe den Eclipse Visual Editor verwendet..
 

L-ectron-X

Gesperrter Benutzer
Hast du das Package java.awt importiert? Benutzt du Klassen aus diesem Package, die von Component erben?
 

Wildcard

Top Contributor
Ich hab mir den Titel durchgelesen, und mir war eigentlich schon klar das ich etwas in dieser Richtung finde: :D
Code:
GUI.parseProgressBar.paint(GUI.parseProgressBar.getGraphics());
Ein paar Swing Grundsätze die man beachten sollte solange man noch nicht genau weiß was man tut:
- nicht mit AWT mischen
- niemals getGraphics auf einer Komponente aufrufen
- niemals paint aufrufen oder überschreiben
- niemals ein Graphics Objekt speichern
 

jensr

Mitglied
Ja tue ich:

import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Event;
import java.awt.BorderLayout;
import java.awt.Font;

Aber ich komme doch nicht ohne diese aus oder?


Lasse ich diese Codezeile weg, wird die JProgressbar aber erst nach dem Funktionsauruf aktualisiert..
Code:
GUI.parseProgressBar.paint(GUI.parseProgressBar.getGraphics());
 

L-ectron-X

Gesperrter Benutzer
Keine der von dir verwendeten Klassen aus AWT erbt von Component, also scheidet diese Möglichkeit eines Fehlers schon aus. Bleiben noch die Ansätze vopn Wildcard zu verfolgen.
 

jensr

Mitglied
MMh, also halte ich die 3 Punkte ein:
- niemals getGraphics auf einer Komponente aufrufen
- niemals paint aufrufen oder überschreiben
- niemals ein Graphics Objekt speichern

wird der Bar ja erst am Schluss gezeichnet..
 

jensr

Mitglied
Ich benutze bisher nicht mehrere Threads, da ich es so einfach nicht zum laufen bekomme, im moment mache ich es so:

Eine Funktion in meiner GUI-Klasse:

Code:
private JScrollPane getParseResultsFrame() {
        
		parseResultsFrame = new JScrollPane();
		parseResultsFrame.setBounds(new Rectangle(-1, 80, jFrame.getSize().width-6, 400));
		
		parseButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				File checkdir = new File(getDirCText().getText());
				if (checkdir.exists() && checkdir.isDirectory()) {
					parseProgressBar.setVisible(true);
					try {
						rowData = MP3Parser.parse(getDirCText().getText());
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					parseResultsFrame.setViewportView(getParseResultsTable());
 				} else {
					JOptionPane.showMessageDialog(null, "This is not a directory!");
				}
			}
		});
		return parseResultsFrame;
	}


Die Funktion in der MP3Parser-Klasse:


Code:
public static String[][] parse(String parseDir) throws IOException {
		File[] filenames = null;
		filenames = getFiles(parseDir);
		String[][] Tags = new String[filenames.length][7];
		GUI.parseProgressBar.setMaximum(filenames.length);

		for (i = 0; i < filenames.length; i++) {
	           GUI.parseProgressBar.setValue(i+1);
		   //enforce painting the progress bar immediatly
	           GUI.parseProgressBar.paint(GUI.parseProgressBar.getGraphics());
                   
                   /*
                   / ziemlich rechenaufwendiges zeugs
                   */
		}

		return Tags;
	}


Lasse ich nun diese Zeile weg:
Code:
GUI.parseProgressBar.paint(GUI.parseProgressBar.getGraphics());

läuft das Programm zwar wieder schneller und die Bar flackert nicht, aber die Bar wird erst gezeichnet, also die 100%, wenn die Funktion parse() durchgelaufen ist, da ja die Swing-Oberfläche solange blockiert ist.

Wenn ihr mir helfen könnt, das mit mehreren Threads aufzubauen, gibt zwar viele Tutorials im Netz, aber mein Hauptprogramm ist mittlerweile ziemlich komplex und irgendwie blicke ich das nicht mehr auf mein Programm anzuwenden!

Gruß Jens
 

Wildcard

Top Contributor
Jau, du hast dir ja selbst schon das Stichwort gegeben: Threads.
Alles was zeitintensiv ist darf nicht im EventDispatcher Thread ausgeführt werden.
 

jensr

Mitglied
Ich werd verrückt, ich sitze da jetzt seid 10 Stunden dran und auf einmal gehts! :D

Code:
private JScrollPane getParseResultsFrame() {
       
      parseResultsFrame = new JScrollPane();
      parseResultsFrame.setBounds(new Rectangle(-1, 80, jFrame.getSize().width-6, 400));
      
      parseButton.addActionListener(new java.awt.event.ActionListener() {
         public void actionPerformed(java.awt.event.ActionEvent e) {
            File checkdir = new File(getDirCText().getText());
            if (checkdir.exists() && checkdir.isDirectory()) {
               parseProgressBar.setVisible(true);
               new Thread() {
                  @Override
                     public void run() {
		        try {
			   rowData = MP3Parser.parse(getDirCText().getText());
		        } catch (IOException e1) {
			   e1.printStackTrace();
			}
			parseResultsFrame.setViewportView(getParseResultsTable());
		     }
		 }.start();
            } else {
               JOptionPane.showMessageDialog(null, "This is not a directory!");
            }
         }
      });
      return parseResultsFrame;
   }

Code:
public static String[][] parse(String parseDir) throws IOException {
      File[] filenames = null;
      filenames = getFiles(parseDir);
      String[][] Tags = new String[filenames.length][7];
      GUI.parseProgressBar.setMaximum(filenames.length);

      for (i = 0; i < filenames.length; i++) {
              SwingUtilities.invokeLater( new Runnable() {
				public void run() {
					GUI.parseProgressBar.setValue(i+1);
				}
			});
                   
                   /*
                   / ziemlich rechenaufwendiges zeugs
                   */
      }
      return Tags;
   }

Vielen Dank
Gruß Jens
 

jensr

Mitglied
Jetzt nur noch eins, wie mache ich das, dass die JProgressBar wieder verschwindet, sobald der Thread abgearbeitet ist?


Gruß Jens
 

Larouso

Mitglied
in der Methode in der du den Thread "startest" mit join() warten bis er beendet ist und dann dispose() für deinen ProgressBar-Frame aufrufen? nur so ne idee...
 

HardNoise

Mitglied
Hi,

hier noch ein Vorschlag:
How to Use Progress Bars

Ich schreibe meine ProgressBars nur noch so. Außenrum ein Wrapper, der die Werte entgegennimmt und innen ein TimerThread, der die Werte, bei mir meistens im 100ms Intervall, in die eigentliche Progressbar schreibt.

Christian
 
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
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
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
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
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
M Warum flackert das Bild ? (Swing) AWT, Swing, JavaFX & SWT 16
frankred Swing Eigener ListCellRenderer D'n'D "MOVE" - Mauszeiger flackert AWT, Swing, JavaFX & SWT 14
T Swing OpenOffice IFrame flackert beim ändern der Größe AWT, Swing, JavaFX & SWT 6
K Swing Spiel flackert sehr häufig AWT, Swing, JavaFX & SWT 2
J Applet Tetris flackert AWT, Swing, JavaFX & SWT 9
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
J Swing JWindow flackert trotz Doppelpufferung AWT, Swing, JavaFX & SWT 2
B Swing JButton flackert trotz DoubleBufferings AWT, Swing, JavaFX & SWT 11
J Swing JEditorPane flackert AWT, Swing, JavaFX & SWT 2
H Swing JWindow flackert beim resizen AWT, Swing, JavaFX & SWT 6
Dragonfire ZoomImage flackert -> Fehler: repaint-Aufruf [gelöst] AWT, Swing, JavaFX & SWT 5
P Image auf JPanel flackert AWT, Swing, JavaFX & SWT 3
M DragAndDrop-Waypoints bewegen, ABER Bildschirm flackert AWT, Swing, JavaFX & SWT 3
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
C JScrollPane flackert AWT, Swing, JavaFX & SWT 10
F JScrollPane ruckelt/flackert AWT, Swing, JavaFX & SWT 5
S [Swing] Tabelle flackert AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben