Swing ImageIcon mit Bild aus Temp-Verzeichniss füllen

Cromm Cruach

Mitglied
Hallo,

mein Formular muss mit Bildern aus dem Internet gefüllt werden (JLabel mit ImageIcons). Bisher hab ich das so gelöst! (Da der Code sehr komplex stelle ich nur den Code hinein der beim Ladevorgang durchlaufen wird!)

Java:
	public ImageIcon loadPicture( String adress, int width, int height, int id, int option ) throws IOException {

		ImageIcon icon = null;

		switch ( option ) {
			case 0 :
				icon = new ImageIcon( new URL(adress) );
				break;

			[...]
		}

		icon.setImage( icon.getImage().getScaledInstance( width, height, Image.SCALE_DEFAULT ) );

		return icon;
	}

Pro bild wird ein JPanel befüllt, welches dann in einer JList angezeigt wird. Mit dem oben gezeigten
Code:
loadPicture()
funktionierte alles perfekt! Der einzige Nachteil dieser Methode war / ist, das die Bilder währen der Laufzeit im Arbeitsspeicher gespeichert werden. So kann es sein das ein Formularaufruf (ja nach Anzahl und größe der Bilder) den von Programm belegten Speicher ab und an mal auf 1,5 - 2 GB steigen lassen kann.

Um dieses Problem zu lösen, hab ich als neuen Ansatz überlegt, die Bilder im TEMP-Verzeichnis zwischen zu speichern und sie daraus anzeigen zu lassen. Daher hab ich die
Code:
loadPicture()
wie folgt umgeschrieben:

Java:
	public ImageIcon loadPicture( String adress, int width, int height, int id, int option ) throws IOException {

		ImageIcon icon = null;

		switch ( option ) {
			case 0 :
				StringTokenizer t = new StringTokenizer( adress, "/", false );
				String filename = null;
				while ( t.hasMoreTokens() ) {
					filename = t.nextToken();
				}
				downloadPicture( adress, null, filename, COVER_TEMP );
				Image img = ImageIO.read( new File( System.getProperty( "java.io.tmpdir" ) + filename ));
				icon = new ImageIcon( img );
				break;

			[...]
		}

		icon.setImage( icon.getImage().getScaledInstance( width, height, Image.SCALE_DEFAULT ) );

		return icon;
	}

Der Download wird nun von der Methode
Code:
downloadPicture( adress, null, filename, COVER_TEMP );
übernommen. Das Funktioniert die Bilder sind nacher alle im unter
Code:
C:\Users\[I][Mein_Username][/I]\AppData\Local\Temp\[I][Dateiname][/I]
zu finden und lassen sich auch mit einem Bildbearbeitungsprogramm öffnen (Datein sind also nicht beschädigt oder so).

Auch meine Liste wird Angezeigt nur leider sind die Label die die ImageIcons anzeigen sollen leer und ich verstehe nicht warum.

Gruß
 

Michael...

Top Contributor
An dem Code sehe ich jetzt nichts falsches.

Aber grundsätzlich landen die gelandenen ImageIcons immer im Arbeitsspeicher, egal ob die Bilder aus dem Web oder von der Festplatte geladen werden. Für das Speicherproblem hat das also keine Auswirkungen.
 

Cromm Cruach

Mitglied
Ok mal abseits das die Bilder eh im Arbeitsspeicher landen! An einer andere stelle (hier müssen die Bilder von der Festplatte geladen werden) habe ich das gleiche Problem. Kein error doch die Bilder werden in der List nicht angeigt. Bilder die über URL geladen werden werden angezeigt. Lade ich ein Bild aus der Jar mit:
Code:
 icon = new ImageIcon( ImageIO.class.getResource( adress ) );
Funktioniert es auch.

Nur
Code:
icon = new ImageIcon( ImageIO.read( new File(adress ) ));
geht nicht!

EDIT:

Das Problem ist an der Liegt an der Übergabe an die JLIST

Das Ist mein ListCellRenderer (Funktioniert bis auf die Bilder)

Java:
public class CastListRenderer extends CastPanel implements ListCellRenderer<CastPanel>{

	@Override
	public Component getListCellRendererComponent( JList<? extends CastPanel> list, CastPanel value, int index, boolean isSelected,
													boolean cellHasFocus ) {

		this.setCover( value.getCover() );
		this.setActor( value.getActor() );
		this.setName( value.getName() );
		
        if (isSelected) {
        	 setBackground(UIManager.getColor("List.selectionBackground"));
        } else {
        	setBackground(UIManager.getColor( "Panel.background" ));
        }
		
		return this;
	}


	
}

Hier noch der Getter und Setter für die Cover (aus der CoverPanel)

Java:
	/**
	 * Setzt ein neues Cover
	 * 
	 * @param image
	 *            Icon Cover
	 */
	public void setCover( Icon image ) {

		coverLabel.setIcon( image );
	}


	/**
	 * Liefert das Cover zurück
	 * 
	 * @return Icon Cover
	 */
	public Icon getCover() {

		return coverLabel.getIcon();
	}

Wie gesagt hier muss der Fehler liegen. Kommt das Bist von einer URL oder wirt mit
Code:
 icon = new ImageIcon( ImageIO.class.getResource( adress ) );
geladen wird es angezeigt nur wenn es aus einer Dabei kommt nicht! ich denke daher das die Überhabe für datein hier falsch ist!
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Bilder die über URL geladen werden werden angezeigt. Lade ich ein Bild aus der Jar mit:
Code:
 icon = new ImageIcon( ImageIO.class.getResource( adress ) );
Funktioniert es auch.

Nur
Code:
icon = new ImageIcon( ImageIO.read( new File(adress ) ));
geht nicht!
In einem jar gibt es keine Files. Hier geht nur das laden mittels getResource(...)
 

Cromm Cruach

Mitglied
die datein die ich lade liegen nicht in der JAR ich habs nur mit welchen in der jar getestet damit gehts aus:

Also:

Mit URL und getRessource aus jar laden geht alles perfekt

Mit File aus einen Ordner auf der Festplatte funktioniert der ladeforgang und kann auch (allgemein in einem Label angzeigt werden) nur in der JList gibts probleme! Also muss es am CellREnderer liegen. Er redet die Icons von der URL und mittels get ressource perfekt aber mit File funktionierts nicht.

Geht vll iwie der bezug (Verbindung) zur Datei verloren das das Icon iwie nicht mehr "weis" wo die Bildinformationen herkommen?!
 

Michael...

Top Contributor
Die Konstellation/Konzeption * ist zwar etwas merkwürdig, aber einen Fehler seh ich in dem hier geposten Code nicht.

* Als Renderer nutzt ein CastPanel, gleichzeitig scheinen in der Liste CastPanels drinzustecken (eigentlich unschön). Du könntest als das CastPanel aus der Liste nehmen, denn Hintergrund anpassen und als Rendering Komponente zurückgeben. Das übertragen der Werte auf das Renderer CastPanel könnte man sich sparen.
Allerdings würde man i.d.R. in eine JList keine graphischen Komponenten stecken, sondern nur Datenobjekte. Beim Rendern überträgt man relevante Daten auf die Rendererkomponente bzw. passt diese abhängt vom Datenobjekt an.
 

Cromm Cruach

Mitglied
Mist ist nun noch ein weiteren Phänomen aufgeallen. Ich habn (nochmal zum testen ob mit dem panel an sich alles Klappt) Neben der JList nun noch ein Tab mit einem JScrollPane und einem Panel eingefügt. In diesem Panel fühe ich nun meine CastPanels hinzu.

Wie vorherschon werden in meiner JList die Bilder in den Panels nicht angezeigt. Auf den ScrollPane mit dem Panel schon. Klicke ich nun auf den Tab meiner JList, werden auch dort die Bilder angezeigt. Aber erst nachdem ich auf dem Tab mit den SCrollpane war.

Nehme ich den ScrollPane mit dem Panel heraus und lasse nur den Tab dring (dachte iwie ein ein Problem mit repaint oder so) wir trotz klicken auf den Tab die bilder nicht angezeigt.

Also:
Wenn die Panels neben der JList auch noch in einem Panel (mit Boxlayout Y-Axis) eingefügt werden, werdne die bilder danach auch in der JList sichtbar.

Also das verwirrt mich iwie nun komplett :)
 

Michael...

Top Contributor
Schon mal ein bisschen debugged? ... im Renderer überprüft, ob
Code:
value.getCover()
im Renderer evtl. null liefert.
Wie sieht denn der Code zu dem ominösen CastPanel aus.
 

Cromm Cruach

Mitglied
Ja klar :). Der Wert ist nicht null. Sondert die speiceradresse des Bildes was geladen wird. Wie gesagt die anzeige funktioniert, sobald das panel wo anders angezeigt wurde / wird...
 

Cromm Cruach

Mitglied
So habe den Programmteil nun in ein KSKB ausgelagert (Eclipse). Die benötigten bildinformationen die normalerweise aus einer DB kommen hab ich nun in einem ARRAY-Gespeichert.

Das Panel Schauspieler ist das "Problem-Panel" mit der JLIST.

VisiblePanel ist das die Lösung mit den Panels in einer ScrollPane (die ja funktioniert). So kannst du dir auch das Phänomen ansehen das die Bilder in der List angezeigt werden sobald man sich einmal das VisiblePanel angesehen hat. Ich hoffe du findest was :)

Da die Datei durch die Bilder etwas größer ist musste ich sie bei einem FileHoster hochladen:

KSKB - JLIST Anzeigeproblem.zip (11,6 MB)
 

Cromm Cruach

Mitglied
kürzer ging leider nicht sonst wären nicht alle beteiligten funktionen dringewesen. Hatte angst, dass ich nachher genau der teil fehler der für das prob verantwortlich ist :)
 

Michael...

Top Contributor
so hatte die letzten Tage leider wenig Zeit und habe mir das ganze jetzt mal kurz angeschaut. Die Problemursache ist das skalieren der Bilder. Laut API Doku kann der Skalierungsprozess asynchron ablaufen und in Deinem Fall tut er das scheinbar auch. Allerdings bekommen der Renderer scheinbar nicht mit, wenn die skalierten Icons "vollständig" sind.
Eine Alternative (nicht getestet) zur von Dir verwendeten Method könnte folgendes sein.
The Perils of Image.getScaledInstance() | Java.net
Eventuell könntest Du die Bilder ja bereits korrekt skaliert speichern.

So ganz habe ich Deinen Aufbau und die Informations- und Kontrollflüsse noch nicht durchblickt. Allgemein sind da noch ein paar Schwachstellen in Deinen Klassendesign. z.B. sollte der Controller die View steuern. In Deinem Fall erzeugt die View den Controller.
Das packen der CastPanels in das ListModel hatte ich ja schon mal bemängelt.
 

Cromm Cruach

Mitglied
Leider kann man den Bedankenbutton nur einmal drücken. Vielen Dank für die Hilfe ich hatte die Hoffnung schon aufgegeben. Auf die Idee mit dem Skalieren wäre ich nie gekommen.

So funktioniert es nun:

Java:
				BufferedImage image = ImageIO.read( new File("ressource/cast/" + id + "/filmography/"  + adress)  );
			    Image scaled = image.getScaledInstance(width, height, Image.SCALE_SMOOTH );
			    icon = new ImageIcon(scaled);

Vielen Dank!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
M ImageIcon Bild wird beim verkleinern des Fensters nicht verkleinert AWT, Swing, JavaFX & SWT 3
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
L ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung) AWT, Swing, JavaFX & SWT 11
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
Tausendsassa ImageIcon?! Hilfe! AWT, Swing, JavaFX & SWT 10
S JLabel mit ImageIcon, komischer Rahmen? AWT, Swing, JavaFX & SWT 2
O ImageIcon lädt nicht AWT, Swing, JavaFX & SWT 2
kaoZ Swing JToolBar, ImageIcon werden teilweise verdeckt AWT, Swing, JavaFX & SWT 0
R ImageIcon - Über Socket AWT, Swing, JavaFX & SWT 1
P ImageIcon lade schlägt fehl AWT, Swing, JavaFX & SWT 5
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
P ImageIcon auf Rectangle AWT, Swing, JavaFX & SWT 3
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
A Swing ImageIcon hover AWT, Swing, JavaFX & SWT 9
B Swing ImageIcon Resizing AWT, Swing, JavaFX & SWT 15
S ImageIcon von Label entfernen AWT, Swing, JavaFX & SWT 9
B Warten bis neues ImageIcon zugewiesen ist AWT, Swing, JavaFX & SWT 3
Zettelkasten imageIcon-Rand wegmachen AWT, Swing, JavaFX & SWT 5
S Abspeichern aus einem ImageIcon ins korrekte Format AWT, Swing, JavaFX & SWT 2
J ImageIcon: ZipException bei ungültiger PNG-Datei AWT, Swing, JavaFX & SWT 2
S ImageIcon Grösse anpassen AWT, Swing, JavaFX & SWT 2
J Geladene Grafik in ImageIcon auf Panel fest positionern. AWT, Swing, JavaFX & SWT 8
badfish Swing ImageIcon auf JLabel, Fenster Maximieren verbieten und Icon oben links austauschen? AWT, Swing, JavaFX & SWT 5
B Problem mit imageIO und ImageIcon AWT, Swing, JavaFX & SWT 5
M Swing ImageIcon über JFileChooser einbinden AWT, Swing, JavaFX & SWT 4
C Swing JComboBox - Problem bei Darstellen von ImageIcon AWT, Swing, JavaFX & SWT 4
G ImageIcon viel zu groß AWT, Swing, JavaFX & SWT 2
G IMageIcon Bildgröße ändern AWT, Swing, JavaFX & SWT 7
isowiz Leeres ImageIcon einer bes timmten Größe erzeugen AWT, Swing, JavaFX & SWT 2
W ImageIcon im JLabel mit autosize? AWT, Swing, JavaFX & SWT 3
B ImageIcon JFrame AWT, Swing, JavaFX & SWT 3
M ImageIcon auf AbstractButton links-/rechtbündig AWT, Swing, JavaFX & SWT 2
D jButton mit ImageIcon & MouseListener AWT, Swing, JavaFX & SWT 5
M ImageIcon in JLabel verkleinern AWT, Swing, JavaFX & SWT 8
S n-e-w JLabel(n-e-w ImageIcon(i)) funkt. nicht im JScrollPane AWT, Swing, JavaFX & SWT 2
M Problem, an ImageIcon in JPanels zu kommen. AWT, Swing, JavaFX & SWT 2
J Bildfilterung und Ausgabe in ein ImageIcon AWT, Swing, JavaFX & SWT 2
X ImageIcon für JButton AWT, Swing, JavaFX & SWT 4
X JButton "effect" für ImageIcon AWT, Swing, JavaFX & SWT 6
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T ImageIcon als Seperator im Jmenu AWT, Swing, JavaFX & SWT 8
G JLabel und ImageIcon AWT, Swing, JavaFX & SWT 16
padde479 ImageIcon laden AWT, Swing, JavaFX & SWT 6
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
J ImageIcon, Image - 100% CPU Auslastung . AWT, Swing, JavaFX & SWT 3
B imageicon relativer Pfad AWT, Swing, JavaFX & SWT 5
F ImageIcon Größe ändern AWT, Swing, JavaFX & SWT 29
M ImageIcon / .paintIcon() AWT, Swing, JavaFX & SWT 2
M Problem mit ImageIcon in einer JTable AWT, Swing, JavaFX & SWT 2
D JButton einen neuen ImageIcon setzen? AWT, Swing, JavaFX & SWT 2
R resize ImageIcon AWT, Swing, JavaFX & SWT 7
B Problem mit ImageIcon/Swing in Linux AWT, Swing, JavaFX & SWT 6
K ImageIcon fehler ? AWT, Swing, JavaFX & SWT 4
M ImageIcon laden? AWT, Swing, JavaFX & SWT 2
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15

Ähnliche Java Themen

Neue Themen


Oben