Forschrittsbalken

MasseElch

Aktives Mitglied
Hallo Forum,

ich habe Methoden, die einen übergeben Ordnderpfad nach mp3-Datein durchsuchen und aus denen dann das CoverImage mit Hilfe der mp3agic library auslesen.

Ordner durchsuchen und mp3-files finden:
Java:
private void listDir(File dir) {

		File[] dirArr = dir.listFiles();
		if (dirArr != null) {
			for (int i = 0; i < dirArr.length; i++) {
				if (dirArr[i].isDirectory()) {
					listDir(dirArr[i]); // ruft sich selbst mit dem 
										// Unterverzeichnis als Parameter auf
				}else {
					if(dirArr[i].getName().endsWith("mp3"))
						this.mp3Locations.add(dirArr[i].getAbsolutePath());
				}
			}
		}
	}

Liste mit mp3-dateien durchgehen und aus ihnen die Coverbilder rauslesen:
Java:
public Images(ArrayList<String> mp3Locations) {
		this.images = new LinkedList<ShowImage>();
		BufferedImage tmpImage;
		ShowImage tmpShowImage;
		int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
		int imageHeight = screenHeight/5;
		int initialyPos = -imageHeight;
		
		try {
			for (String mp3Location : mp3Locations) {
				Mp3File song = new Mp3File(mp3Location);
				if (song.hasId3v2Tag()){
					ID3v2 id3v2tag = song.getId3v2Tag();
					//get data out of mp3File
					byte[] imageData = id3v2tag.getAlbumImage();
					String interpret = id3v2tag.getArtist();
					String title = id3v2tag.getTitle();
					//is there an image?
					//yes there is, so use it
					if(imageData != null) {
						//converting the bytes to an image
						tmpImage = ImageIO.read(new ByteArrayInputStream(imageData));
					//no there isnt so take placeholder instead
					} else {
						tmpImage = ImageIO.read(getClass().getResource("../resource/noImage.jpg"));
					}
					tmpShowImage = new ShowImage(tmpImage, initialyPos, interpret, title);
					this.images.add(tmpShowImage);
					initialyPos -= imageHeight+20;
				}
			}
			
			this.yPosLastImage = initialyPos+screenHeight+2*imageHeight;
			
		} catch (IOException | InvalidDataException | UnsupportedTagException e) {
			//TODO - Exception Handling
		}

Das dauert natürlich unter Umständen etwas länger.

Bisher lasse ich dann einen Dialog anzeigen, der sagt: Bitte warten es wird gesucht.

Das Programm reagiert während es sucht auf keinerlei Aktionen vom Benutzer.

Nun möchte ich gerne einen Fortschrittsbalken einbauen, der anzeigt, dass auch was getan wird. Sonst kommt schnell der Verdacht auf: "Da passiert ja gar nichts! Das Programm ist bestimmt abgestürzt!" un Unmut macht sich breit.

Nun bin ich Neu in Java und bin vollkommen mit Threads und dem ganezn drumherum überfordert.

Google gibt zwar viele Beispiele, von denen verstehe ich aber nicht viel.

Kann mir einer von euch helfen?

Eine auf mein Problem zugeschnittene Anweisung, was ich tun muss wäre super perfekt. Ich will netürlich nicht, dass mir jemand die Arbeit abnimmt, einfach nur, dass jemand mir die Reihenfolge dessen erklärt, was ich denn tun muss.

Lg
MasseElch

Ps:
EIne weitere Frage: Die Methode listDir() schreibt ja nur die absoluten Pfade in die Liste. Ist es hier sinnvoll, direkt die files reinzuschreibenund zu übergeben? Das spart Zugriffszeit auf den Speicher, ich habe da aber Angst, dass das Array dann schnell zu groß wird und den Speicher sprengt. Ist das eine berechtigte Sorge?
 

Gucky

Top Contributor
Erst mal zum Speicher. Wie groß wird das denn? Eigentlich dürfte das kein großes Problem sein.
Zum Fortschrittbalken: du weißt wie oft insgesamt deine Schleifen durchlaufen werden. Dann setzt du das Maximum deiner ProgrssBar auf diesen Wert und jedes Mal, wenn eine Schleife durchlaufen wird setzt du einen Zähler einen hoch und übergibst diesen der setValue() Methode der ProgressBar. Das wäre eine Möglichkeit und die einzige, die mir schnell einfällt. Ich bin mir aber sicher, dass es noch andere gibt. Eine weitere wäre:
Code:
pb.setValue(pb.getValue + 1);

Zu den Threads: es wäre gut, wenn du alles in einen separaten Thread verfrachtest, weil das Programm dann immer noch auf Eingaben reagieren könnte, die du natürlich entsprechend behandeln müsstest.
Wichtig: Nur den AUFRUF der entsprechenden Methoden in den Thread. Nicht alle Methoden. Threads starten tut man mit threadname.start(). Dann wird die run Methode ausgeführt. Wie so ein Thread auszusehen hat, fragst du bitte Google.
 

MasseElch

Aktives Mitglied
Das können durchaus schnell an die 500 Dateien werden.

Ich schau mir Threads weiterhin an.

Ich werde spätr mal posten was ich da zusammengeschustert habe.

Vielen Dank schon Mal!

MasseElch
 

MasseElch

Aktives Mitglied
Hey,

also was mir grad SOrge bereitet:

Du sagtest ich wüsste wie viele Schleifendurchläufe ich habe, aber das weiß ich ja leider nicht.

Ist ein rekursiver Aufruf

Was tu ich nun?

Lg
 

ry_void

Mitglied
Hallo,

sorry für die etwas Abstrakte Antwort.

Du kannst natürlich erstmal einen Vorlauf machen und die Zahl der Dateien ermitteln.

Vorteil: Du hast die genauen Zahlen und kannst deine progressbar immer entsprechend erhöhen.
Nachteil: Du hast zwei Durchläufe.

Du kannst aber auch beim ermitteln, mittels Threads die Dateien laden. Gleichzeitig sammelst du die Zahl in einer Klassenvariable? und aktualisierst bei jedem Fund die Zahlen deiner progressbar.

Für welchen weg du dich entscheidest liegt bei dir. Probier mal rum. Bei der zweiten Geschichte kommen recht lustige Sachen heraus :)
 

MasseElch

Aktives Mitglied
Hmm....

ich denke mal die erste ist da besser.

nehmen wir an ich hab ne orndersturktur mit dre ordnern und im dritten sind 40 und da im letzen wieder 40. Dann hoppst die Anzeige von 66% auf 3% und wenn sie wider bei 70 oder so ist geht sie wieeder zurück..



Da werde ich mich wohl für die erste Variante entscheiden.

EIne Frage hab ich da noch, was mir grad einfiel:

Hat nicht das System genaue Daten darüber wie viele Dateien in einer Ordnerstruktur sind? Und wenn ja kann man die vllt irgendwie abfragen?

Lg
 

ry_void

Mitglied
Natürlich:

Java:
File folder = new File(path);
File[] files  = folder.listFiles();
files.lenght;

Nur was machst du wenn da noch ein Ordner ist?
 

JavaMeister

Gesperrter Benutzer
Oder logarithmische Darstellung aller Rekursionen und wenn es fertig ist, dann auf 100 setzen ;D

Der User soll ja nur nicht den Eindruckt haben, als ob es nicht weiter geht.
 

MasseElch

Aktives Mitglied
DAS ist ne gute Idee!

Dann hab ich wenigstens das Gefühl das DIng tatsächlich mal zu nutzen. Muss ja n Grnd haben wozu wir das Zeug lernen mussten :)

Hehe, guter Tipp.

Ich stells rein, wenn ichs fertig habe und es funktioniert!
 

Oben