Kommunikation zwischen zwei Klassen

Gecko

Mitglied
Hallo zusammen!

Ich bin gerade dabei mir Java anzueignen und habe ein paar Fragen zu einer von mir entworfenen Klasse.
Der Gedanke ist folgender: Ich möchte diese Klasse in mehreren Swing Applikationen nutzen, eine davon ist bereits betriebsbereit. Und zwar möchte ich aus meinen Programmen diese Klasse aufrufen um für einen vom Nutzer angegeben Pfad (egal wie der jetzt eingelesen wird) zwei wesentliche Listen für mich erstellen - Erfassung der OriginalBilder, sowie erstellte Thumbnails davon - und dann die Thumbnails auf die vorhandene Swing Applikation in ein einfaches JScrollPane zeichnen.

Ich poste hier mal meinen Lösungsansatz an dem ich jetzt festhänge, aus dem der Ablauf hoffentlich klar wird:

Java:
import java.awt.Image;
import java.io.File;
import java.util.LinkedList;
import javax.swing.ImageIcon;
/**
 * @author	Andy Rudolph
 * @date 	18.08.2010
 * @project	Medienverwaltung 
 * @package	projekt
 * @file	CreateThumbnails.java
 */
public class CreateThumbnails {

	public LinkedList findings = new LinkedList();
	public LinkedList thumbList = new LinkedList();
	private ImageIcon thumbnail;
	
	public CreateThumbnails() {
		super();
		/*Wie, wo - muss ich das hier aufrufen ??
		searchImage(null, null);
		createImageThumb();
		pasteThumbs();*/
	}
	/**
	 * Schritt 1: 
	 * Durchsucht das beim Start angegebene Verzeichnis 
	 * auf vorhandene und unterstützte Bildtypen und 
	 * speichert diese in einer File-List
	 */
	public void searchImage(File directory, FoundListener fnd)
	{
		File[] files = directory.listFiles();
		for(int i=0; i< files.length; i++)
		{
			if(files[i] != null && files[i].exists())
			{
					if(files[i].getName().contains("jpg")
							||files[i].getName().contains("png")
							||files[i].getName().contains("gif"))
					{
						findings.add(files[i]);
						if(fnd != null) fnd.fileFound(files[i]);
					}
					if(files[i].isDirectory())
						searchImage(files[i], fnd);
			}
		}
	}
	/**
	 * Schritt 2:
	 * Liest die erstellte File-List aus und erstellt 
	 * zu jedem Eintrag ein passendes Thumbnail.
	 */
	public void createImageThumb() {        
		
		File[] thumbs = thumbList.listFiles();
        for (int i = 0; i < thumbs.length; i++) {
			
        	ImageIcon tmpIcon = new ImageIcon((String) findings.get(i));
			if (tmpIcon != null) {
				if (tmpIcon.getIconWidth() >= tmpIcon.getIconHeight()) {
					//landscape
					if (tmpIcon.getIconWidth() > Konstanten.PIDIM.width) {
						thumbnail = new ImageIcon(tmpIcon.getImage()
								.getScaledInstance(Konstanten.PIDIM.width, -1,
										Image.SCALE_DEFAULT));
					} else { 
						thumbnail = tmpIcon;
					}
				} else {
					//portrait
					if (tmpIcon.getIconHeight() > Konstanten.PIDIM.height) {
						thumbnail = new ImageIcon(tmpIcon.getImage()
								.getScaledInstance(-1, Konstanten.PIDIM.height,
										Image.SCALE_DEFAULT));
					} else { 
						thumbnail = tmpIcon;
					}
				}
				thumbList.add(thumbs[i]);//Zunächst temporär
				//TODO speichern der Thumbnails in einem hierzu
				//angelegten Verzeichnis
			}
		}
    }
	/**
	 * Schritt 3:
	 * List die vorhandene Thumbs-Liste aus und zeichnet 
	 * die Thumbs in der von der Main-Klasse gestartete 
	 * Swing-Anwendung in das JScrollPane.
	 */
	public void pasteThumbs() {
		//TODO Thumbnails auf vorhandene Swinganwendung
		//in JScrollPane zeichnen (Klasse: Main.java)
	}
}

Das rekursive Einlesen eines Verzeichnisses hab ich glaube ich sowit verstanden, mit Hilfe der API hab ich das in der ersten Methode (hoffentlich) richtig umgesetzt. Danach möchte ich die erstellte File-Liste nutzen um daraus Thumbnails zu kreieren. Auch das müsste soweit ungefähr stimmen, wobei ich mit dem Casting am Anfang der 2. Methode noch Probleme habe.
Dann möchte ich die erstellten Thumbnails in meine Swing-Applikation zeichnen, die extra dafür ein JScrollPane zur Verfügung stellt.

Fragen:

1. Ist es in Java mit Hilfe von Runnable/synchronized möglich, die Hauptaplikation zu starten, zu nutzen, DANN im Hintergrund diese vorgefertigte Klasse aufzurufen und das ScrollPane live zu füllen?
2. Wie caste ich in der 2.Methode richtig auf die verd... File-List? Da klemmts grad...
3. Wie erreiche ich das JScrollPane - nennen wir es einfach mal "thumbsPane" aus dem Hauptprogramm?

Vielen Dank schon mal für die Mühe sich die ganze Geschichte mal anzuschauen, ich freue mich auf Hilfe!

Liebe Grüße
Gecko
 

HoaX

Top Contributor
Java:
public class CreateThumbnails {

	public LinkedList findings = new LinkedList();
	public LinkedList thumbList = new LinkedList();
	private ImageIcon thumbnail;

	/**
	 * Schritt 1: 
	 * Durchsucht das beim Start angegebene Verzeichnis 
	 * auf vorhandene und unterstützte Bildtypen und 
	 * speichert diese in einer File-List
	 */
	public void searchImage(File directory, FoundListener fnd)
	{
		File[] files = directory.listFiles();
		for(int i=0; i< files.length; i++)
		{
			if(files[i] != null && files[i].exists())
Wozu? Meinst du listFiles() erzeugt zufällige Dateinamen und mischt die mit rein?
Java:
			{
					if(files[i].getName().contains("jpg")
							||files[i].getName().contains("png")
							||files[i].getName().contains("gif"))
					{
contains? Wohl ehr endsWith! (evtl noch ein toLowerCase() vorher?)
Java:
						findings.add(files[i]);
						if(fnd != null) fnd.fileFound(files[i]);
					}
					if(files[i].isDirectory())
						searchImage(files[i], fnd);
			}
		}
	}
	/**
	 * Schritt 2:
	 * Liest die erstellte File-List aus und erstellt 
	 * zu jedem Eintrag ein passendes Thumbnail.
	 */
	public void createImageThumb() {        
		
		File[] thumbs = thumbList.listFiles();
thubsList ist doch eine LinkedList, wo soll da die Methode listFiles herkommen? Wenn dann direkt die Liste verwenden statt erst ein Array draus zu machen.
Java:
        for (int i = 0; i < thumbs.length; i++) {
Die Liste ist doch zu dem Zeitpunkt noch leer! Die füllst du doch erst innerhalb der Schleife!
Java:
        	ImageIcon tmpIcon = new ImageIcon((String) findings.get(i));
Das schreit geradezu nach einer IndexOutOfRangeException. Wer sagt dass es in dieser Liste den Index gibt?


Fragen:
1. Ist es in Java mit Hilfe von Runnable/synchronized möglich, die Hauptaplikation zu starten, zu nutzen, DANN im Hintergrund diese vorgefertigte
Klasse aufzurufen und das ScrollPane live zu füllen?
2. Wie caste ich in der 2.Methode richtig auf die verd... File-List? Da klemmts grad...
3. Wie erreiche ich das JScrollPane - nennen wir es einfach mal "thumbsPane" aus dem Hauptprogramm?
1. Ja
2. Casten geht nicht. Höchstens toArray(), aber wenn du eh eine Liste hast, warum daraus nochmal ein Array machen, das ist unfug.
3. Garnicht. Das sollte auch nicht die Aufgabe dieser Klasse sein. Wenn dann sollte sich die GUI die Liste geben lassen und selbst zeichnen.
 
Zuletzt bearbeitet:

Gecko

Mitglied
Oje, da hab ich aber nen Haufen Mist produziert... :oops:

1. Also, die Überprüfung ob Files vorhanden sind ist tatsächlich unötig, seh ich ein. Bin wohl einfach zu vorsichtig geworden. Wird entfernt...

2. Statt contains lieber endsWith ist natürlich auch besser, das ich toLower/toUpperCase benutzen sollte war mir nicht klar, da ich davon ausgegangen bin das Dateiendungen in den Betriebssystemen immer klein geschrieben werden. Wird also korrigiert/ergänzt...

3. Ich habe hier einfach das Problem das ich nicht weiß wie ich die vorhandenen Liste "findings" als Schleifenparameter ansprechen soll. Ich dachte das geht über findings.length, nur das funktioniert nicht. Deshalb der Versuch über casting/Array... wie mach ich denn das?

4. mit einer Hilfestellung auf Antwort drei haben sich die anderen beiden letzten Codeschnipsel dann hoffentlich erledigt...

Zur Antwort auf Frage 1 von mir. Schön das das geht, nur als ich es mit

Java:
javax.swing.SwingUtilities.invokeLater(new Runnable(){
			public void run(){
				CreateThumbnails.searchImage(filePath, null);
			}
		});

versucht habe, baute sich das Swing-Fenster nur halb auf, erledigte die Filesuche und war DANN erst betriebsbereit. Wie also funktioniert ein Aufruf, der die Geschichten parallel laufen läßt?

Aber vielen Dank schon mal!
 

Gecko

Mitglied
Hm... wieder zu kompliziert gedacht... :(
Oki, Schleifenparameter ist dann natürlich
Java:
for (int i = 0; i < findings.size(); i++) {
und das Befüllen letztendlich einfach
Java:
thumbList.add(thumbnail);
Soweit so gut, es reift! :)

Den Kommentar hierzu
Java:
ImageIcon tmpIcon = new ImageIcon((String) findings.get(i));
versteh ich allerdings nicht ganz, was denn für einen Index?
Ich greif doch einfach auf die Liste zu, mach aus dem enthaltenen File (bzw. dessen Referenz) mit String einen Dateinamen draus und die Liste ist ja ganz ordentlich befüllt worden, oder wie oder was ist gemeint??
 

Gecko

Mitglied
Ich hab das ganze mit den obigen Anregungen "entschlackt" und eine Rückgabe sowie ordentliche Listen erstellt:
Java:
public class CreateThumbnails {
	//Liste der Original-Bilder
	private List<File> findings = new LinkedList<File>();
	//Liste der Thumbnails
	private List<ImageIcon> thumbList = new LinkedList<ImageIcon>();
	private ImageIcon thumbnail;
	
	/**
	 * Schritt 1: 
	 * Durchsucht das beim Start angegebene Verzeichnis 
	 * auf vorhandene und unterstützte Bildtypen und 
	 * speichert diese in einer File-List
	 * Schritt 2:
	 * Liest die erstellte File-List aus und erstellt 
	 * zu jedem Eintrag ein passendes Thumbnail
	 * @return List<ImageIcon>: erstellte Thumbnails
	 */
			
	public List<ImageIcon> createLists(File filePath) {	
		
		File[] files = filePath.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					createLists(files[i]);
				}
				if(files[i].getName().contains("jpg")
					||files[i].getName().contains("png")
					||files[i].getName().contains("gif")){
					findings.add(files[i]);
				}
			}
		}
		for (int i = 0; i < findings.size(); i++) {
			ImageIcon tmpIcon = new ImageIcon(findings.get(i).getName());
			if (tmpIcon.getIconWidth() >= tmpIcon.getIconHeight()) {
				//landscape
				if (tmpIcon.getIconWidth() > 100) {
					thumbnail = new ImageIcon(tmpIcon.getImage()
						.getScaledInstance(100, -1,	Image.SCALE_DEFAULT));
				} else { 
					thumbnail = tmpIcon;
				}
			} else {
				//portrait
				if (tmpIcon.getIconHeight() > 100) {
					thumbnail = new ImageIcon(tmpIcon.getImage()
						.getScaledInstance(-1, 100,	Image.SCALE_DEFAULT));
				} else { 
					thumbnail = tmpIcon;
				}
			}
			thumbList.add(thumbnail);//Zunächst temporär
	//	TODO speichern der Thumbnails in einem hierzu
	//	angelegten Verzeichnis
		}
		return thumbList;
	}
}

Wenn ich jetzt noch rausfinde wie ich diese Geschichte nach der initialisierung des Hauptteils - also der Swing-Oberfläche des Programmes - so aufrufen kann, das der Anwender in einem der ScrollPanes lediglich einen Hinweis sieht das da was in Arbeit ist, aber trotzdem weiter arbeiten kann, bin ich happy...:)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Kommunikation zwischen zwei *.class Java Basics - Anfänger-Themen 3
J Kommunikation zwischen zwei JAVA-Dateien Java Basics - Anfänger-Themen 8
D Kommunikation zwischen zwei Java Anwendungen möglich? Java Basics - Anfänger-Themen 6
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
F Klassen Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 4
M Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 3
T Kommunikation zwischen Controller und GUI Java Basics - Anfänger-Themen 2
S Frage zur Kommunikation zwischen Objekten Java Basics - Anfänger-Themen 5
V Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 2
S Kommunikation zwischen Komponenten in einem JFrame Java Basics - Anfänger-Themen 10
B Kommunikation zwischen Klasse und Listener Java Basics - Anfänger-Themen 2
L Kommunikation zwischen mehreren Klassen Java Basics - Anfänger-Themen 2
G Nochmal Problem mit Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 3
G Kommunikation zwischen Klassen, aber bitte MVC Java Basics - Anfänger-Themen 12
G Kommunikation zwischen Applet und Java-Anwendung über TCP/IP Java Basics - Anfänger-Themen 3
M Kommunikation zwischen GUI und Event -Klasse Java Basics - Anfänger-Themen 3
Q Kommunikation zwischen Frames Java Basics - Anfänger-Themen 3
B Kommunikation mit Seriellen Schnittstellen + Integration einer lib Java Basics - Anfänger-Themen 1
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
I Kommunikation "normaler PC" mit lokaler Software an "Cloud Service" und umgekehrt Java Basics - Anfänger-Themen 15
izoards Socket Kommunikation Java Basics - Anfänger-Themen 16
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
S JavaFX-Arduino Kommunikation mit LCD-Anzeige Java Basics - Anfänger-Themen 0
M Input/Output Kommunikation mit externen Geräten Java Basics - Anfänger-Themen 0
M OOP Kommunikation MVC und DTO Java Basics - Anfänger-Themen 13
K Kommunikation von Java RMI und Webservices Java Basics - Anfänger-Themen 9
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
E MVC: Kommunikation der Modellteile Java Basics - Anfänger-Themen 12
G Klassen Kommunikation zw. Klassen Java Basics - Anfänger-Themen 28
B Socket Kommunikation in beide Richtungen Java Basics - Anfänger-Themen 12
F Socket Kommunikation Java Basics - Anfänger-Themen 4
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
J Panel-übergreifende Kommunikation Java Basics - Anfänger-Themen 3
J RxTx/RS232 Kommunikation (TwoWay) Java Basics - Anfänger-Themen 10
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
G Datenstruktur und die Kommunikation mit der GUI Java Basics - Anfänger-Themen 10
W Inter-Thread-Kommunikation Java Basics - Anfänger-Themen 3
T Kommunikation zw. 2 Javaprogrammen Aufr --> Verab. -> Java Basics - Anfänger-Themen 6
P Kommunikation mit Prozess Java Basics - Anfänger-Themen 3
H Kommunikation C++ <> Java Java Basics - Anfänger-Themen 4
A Kommunikation Java-Anwendung <-> Java-Applet Java Basics - Anfänger-Themen 24
D Thread und Process Kommunikation bei eigener Console Java Basics - Anfänger-Themen 2
P asynchrone Kommunikation Applet Servlet mit RMI möglich Java Basics - Anfänger-Themen 4
F Kommunikation von 2 Klasse Java Basics - Anfänger-Themen 5
B jtapi <-> tapi Kommunikation Java Basics - Anfänger-Themen 2
S Kommunikation zwsichen Klassen. Java Basics - Anfänger-Themen 9
D J/Direct oder JNI? .bzw. Kommunikation mit Windows-API. Java Basics - Anfänger-Themen 2
M probleme in der kommunikation von klassen Java Basics - Anfänger-Themen 5
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
S Unterschied zwischen Denkweisen Java Basics - Anfänger-Themen 13
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
Ras Unterschied zwischen parser xml and api xml Java Basics - Anfänger-Themen 7
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
U Erste Schritte nextGaussian zwischen zwei Werten Java Basics - Anfänger-Themen 19
jhCDtGVjcZGcfzug Was ist der Unterschied zwischen diesen Quellcodes? Java Basics - Anfänger-Themen 3
rafi072001 Assoziation zwischen Musiker und Label Java Basics - Anfänger-Themen 1
I Best Practice Saubere Verbindung zwischen API und Business Layer mit DTO's Java Basics - Anfänger-Themen 2
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
W User zwischen Optionen wählen lassen Java Basics - Anfänger-Themen 1
I Differenz zwischen LocalDateTime Java Basics - Anfänger-Themen 4
Leo_1789 Differenz ausrechnen zwischen denn idealgewicht und denn echten Gewicht Java Basics - Anfänger-Themen 7
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
NeoLexx Zuweisungskompatibilität zwischen Vererbungsbeziehungen (Polymorphie) Java Basics - Anfänger-Themen 18
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
N Berührung zwischen Rechtecken Java Basics - Anfänger-Themen 5
Y Unterschied zwischen WindowBuilder und herkömmlichen erstellen des GUI´s? Java Basics - Anfänger-Themen 9
J Wert zwischen JFrames übergeben Java Basics - Anfänger-Themen 2
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
E Unterschied zwischen new und import Java Basics - Anfänger-Themen 5
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
Dilara_K Abstand zwischen den Doppelwerten in einem Array herausfinden Java Basics - Anfänger-Themen 20
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
D Zufallszahl zwischen 10 und 99? Java Basics - Anfänger-Themen 5
J Objektzugriff zwischen disjunkten Klassen Java Basics - Anfänger-Themen 1
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
X Input/Output Höchste Temperaturschwankung zwischen 2 Tagen Java Basics - Anfänger-Themen 2
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
Aprendiendo Unterschied zwischen Referenzvariable und Instanzvariable. Java Basics - Anfänger-Themen 2
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
K Klassen Array zwischen Klassen übergeben Java Basics - Anfänger-Themen 2
Arif OOP Die Bindung zwischen einem äußeren und einem inneren Objekt Java Basics - Anfänger-Themen 2
schoenosrockos Unterschied zwischen Objekten und vererbungen Java Basics - Anfänger-Themen 1
S OOP Variablen zwischen mehreren Klassen Java Basics - Anfänger-Themen 11
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ungerade Zahlen ausgeben lassen zwischen Spannweite zweier eingegeben zahlen Java Basics - Anfänger-Themen 6
V Zufallswert zwischen zwei Zahlen a und b Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben