Hallo zusammen!
Ich habe ein paar Fragen zu einer von mir konstruierten 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 wurde) 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:
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** != null && files**.exists())
{
if(files**.getName().contains("jpg")
||files**.getName().contains("png")
||files**.getName().contains("gif"))
{
findings.add(files**);
if(fnd != null) fnd.fileFound(files**);
}
if(files**.isDirectory())
searchImage(files**, 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**);//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/WÄHRENDESSEN 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 Unterstützung!
Liebe Grüße
Gecko