# Animiertes Gif auf JWindow



## markus99 (3. Mai 2012)

Hallo!
Ich versuche seit etwa 3 Stunden ein animiertes Gif in meinen Splashscreen aufzunehmen.
Warum? -> Ladebalken (ohne Prozent o.a., einfach nur eine Animation).

Nur leider bekomm ich das gif ohne einen JFrame nicht reingeklopft, was aber mies aussieht, da der Splashscreen selbst ein loses Objekt ist.

(Nebenbei, ich würde den Splashscreen gerne an einer bestimmten Farbe transparent darstellen!)
Erstmal zu meinem aktuellen Problem.

Hier der Code:


```
import javax.swing.JWindow;
import javax.swing.ImageIcon;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

public class TransparentSplashScreen extends JWindow implements Runnable
{
	private static final long serialVersionUID = 1L;
	Image bi = Toolkit.getDefaultToolkit().getImage("nsp.png"); //Splashscreen Grafik
	ImageIcon ii = new ImageIcon(bi); //Splashscreen
	Image ladebalken =Toolkit.getDefaultToolkit().getImage("balken.gif");
	ImageIcon balken = new ImageIcon(ladebalken);
	private boolean running = false;

	public boolean isRunning()
	{
		return running;
	}

	public void run()
	{
		try
		{
			running = true;
			setSize(ii.getIconWidth(), ii.getIconHeight());
			setLocationRelativeTo(null);
			setVisible(true); //besser als show
			Thread.sleep(5000);
			dispose();
		}
		catch(Exception exception)
		{
			exception.printStackTrace();
		}
		running = false;
		dispose();
	}

	public void paint(Graphics g)
	{
		g.drawImage(bi, 0, 0, this);
	}
}
```

Aufruf in Main Klasse:

```
Thread splashThread = new Thread(new TransparentSplashScreen());
		splashThread.start();
```

Wie könnte ich das gif (als Icon oder Icon oder ImageIcon) animieren - und zwar direkt auf dem Splashscreen?


*Edit:*

Ich habe es nun geschafft den Balken animiert anzuzeigen, allerdings erst sobald ich 2, 3 mal mit der Maus drüber fahre!
Dazu habe ich folgenden Code in die Paint Methode gesetzt (natürlich erst initialisiert).

```
myButton.setIcon(balken);
		myButton.setLocation(80, 160);
		myButton.setSize(400, 50);
		add(myButton);
		//Edit: Auch mit setVisible ändert sich nichts
```

Wenn ich ihn in run() ausführe, dann wird das Spash-Hintergrundbild nach 2, 3 Mausbewegungen mit dem animierten Ladebalken "getauscht", wobei der überschüssige Bereich (Größenunterschied) weiß dargestellt wird :bahnhof:
Aber auch in der Paint-Methode muss ich den Button erst "aktivieren" indem ich mehrmals mit der Maus darüber fahre.


----------



## markus99 (3. Mai 2012)

Edit: Lösung war eigentlich sehr einfach.
Schade dass es auf Donnerstag kaum Nachteulen gibt!

myButton.repaint();

Schiebt den Fokus des Buttons (mit dem animierten GIF) über den Splash-Screen.
Ich habe die ganze Zeit versucht den Button als unteren Layer zu sehen, der vom Splash überdeckt wird .. Könnte mich eines Büschel Haaren entledigen.



*Problem 2*
Falls noch jemand Interesse hat mir bei meinem Problem mit der Transparenz zu helfen, ich wäre überglücklich!

Oben steht noch der Code meines Splash-Screens. Ich möchte eine Farbe des Bildes komplett Transparent haben (es handelt sich nur um abgerundete Kanten). Die Grafik selbst ist bereits transparent vorhanden, als png sowie gif (schon viel getestet ...), wobei Transparenz absolut gegeben ist - habe ich über HTML extra noch einmal getestet.


----------



## Schwertfisch (3. Mai 2012)

Hey,



> Ich möchte eine Farbe des Bildes komplett Transparent haben



also wenn du eine Farbe von einem png oder so ändern willst schau dir da mal an ...

Transparentes Bild in Java

Ich hoffe das hilft dir 

mfg


----------



## markus99 (3. Mai 2012)

Ich weiß nicht warum oder wesshalb, Zuhause lief es problemlos.
Nun habe ich mir meine Files kopiert und ein neues Projekt mit identischen Voraussetzungen erstellt.

Ergebnis: Das animierte Gif funktioniert nicht mehr!
Ich dreh wirklich bald am Rad!

Pfade funktionieren meistens nicht (egal ob Projekt-Resourcen oder nicht), Gifs werden "zufällig" nicht mehr animiert, was stimmt den nicht mit diesem Eclipse Zeug?
Alles reine Glückssache!

In meiner JList habe ich eine Schleife die HTML-Code in die Zeilenelemente einfügt, dabei ein Bild welches im Projekt ist.
Zuhause musste ich den Pfad immer neu ermitteln, nun läuft es durch eine direkte Angabe des Dateinamen? Aber auch nur seit 5 Minuten, vorher war dies nicht der Fallm mit garantiert identischem Code.

Ist das wirklich normal? Ich habe das Gefühl ich lass mich immer auf ein Glücksspiel ein wenn es um Bilder in Eclipse geht.


-> Der Splashscreen startet als Thread und bekommt Methoden von JWindow vererbt. Darauf wird ein Bild gezeichnet (paint()).
Daraufhin wird die Klasse/der Thread ausgeführt (run()). Diese Methoden waren mir neu (Thread-Handling), aber ich habe sie als Ansatz für -meistens erfolgreiche- Versuche genutzt.

Nun Lade ich ein Bild (GIF) über die Klasse Image. Dieses Image lade ich in die Klasse ImageIcon.
Das Objekt ImageIcon mit dem GIF lade ich in einen JButton (bitte nicht fragen wesshalb, ich hatte mit ImageIcon einfach nicht die Möglichkeiten). Dieser jButton wird von mir Initialisiert, Zugewiesen, Gezeichnet, Positioniert und refresht.

Zuhause am Rechner wurde es animiert, auf meinem Notebook aber nicht. :bahnhof:


----------



## Spacerat (3. Mai 2012)

Also solange das Gif auf die Art geladen wird, wie du das machst, brauchst du keinen zusätzlichen Thread, sondern lediglich einen ImageObserver ungefähr so wie hier: http://www.java-forum.org/spiele-mu...rbesserungvorschlaege-spiel-z.html#post877791.
Und was zum H will man immer mit diesem ImageIcon? Ist das der Ersatz des MediaTrackers? Nicht jedes Bild ist ein Icon. Wenn man Bilder ohne MediaTracker laden will kann man das auch anders haben: Per ImageConsumer, ImageProducer und ImageObserver z.B.


----------



## markus99 (3. Mai 2012)

Vielen Dank dass du mir nach meinem Geheule noch helfen möchtest!
Der Witz an der ganzen Sache ist ja dass es auf 2 verschiedenen Computern unterschiedlich abläuft.
Einmal gehts, einmal nicht.

Hoffentlich kann ich etwas mit deinem Link anfangen, bisweilen zähle ich mich zu den blutigen Anfängern.
Ich verstehe halbwegs die Grundstrukturen usw., habe jedoch gerade erst ein Lehrbuch abgearbeitet welches sich auf absolute Basics beschränkt hat.

Nun denn, auf in die 6te SplashScreen Klasse.


----------



## Spacerat (3. Mai 2012)

markus99 hat gesagt.:


> Einmal gehts, einmal nicht.


Verstehe... Blinkersoftware... Verwende doch einfach 'nen Relais. :lol:
Okay, mal im Ernst. Meist liegen solche Fehler an der Verfügbarkeit von nachzuladenen Ressourcen. Ressourcen sind dann Verfügbar, wenn Name und Pfad der Ressource zu einer vorhandenen Datei passen und ebenso auch Zugriffsrechte darauf gewährt wurden.


----------



## GUI-Programmer (3. Mai 2012)

Am besten ist, du lädst deine Bilder per ImageIO: Grafikdateien laden und anzeigen ? Byte-Welt Wiki


----------



## Spacerat (3. Mai 2012)

GUI-Programmer hat gesagt.:


> Am besten ist, du lädst deine Bilder per ImageIO: Grafikdateien laden und anzeigen ? Byte-Welt Wiki


@TO: Schlechte Idee, wenn du ein Gif animieren willst.


----------



## markus99 (4. Mai 2012)

Nochmal getestet. Auf dem Rechner funktioniert es tadellos.
Identisches Projekt, dieselbe JRE/JDK, identischer Code -> funktioniert nicht auf dem Laptop.
Das GIF wird einfach nicht animiert, aber angezeigt.


----------



## Spacerat (4. Mai 2012)

Moment, ich teste mal mit... ... ...
Sag' mal, wo ist eigentlich der funktionierende Code geblieben? Ach, den hattest noch gar nicht gepostet. Tja, dann kann ich dir auch nicht helfen... aber ist sicher was ganz banales.


----------

