# GUI- Einbetten von Gifs



## just_steffi (13. Jan 2011)

Hallo Leute!
Ich bin gerade eben auf dieses Forum gestoßen, ich bin ein Java Neuling und muss ein GUI bis nächste Woche Dienstag fertig kriegen. Die Aufgabe besteht darin eine Grafik "klickbar" zu machen und Sounds hinzuzufügen. Soweit so gut, habe ich alles getan! Ich habe eine Grafik einer Jukebox erstellt und die Buttons mit JButtons versehen. Die Schwierigkeit besteht nun für mich darin, dass ich es so hinkriegen will, dass wenn ich auf einen der Buttons klicke eine .gif Datei abgespielt werden soll. Kann mir da jmd helfen?


```
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;

public class Jukebox extends Frame  
{
	protected static final long serialVersionUID = 1; 
	//Schaltet die nervige Warnung aus ;-)

	//// Button-Icons zuweisen
	protected ImageIcon iconNullBackground   = new ImageIcon(Jukebox.class.getResource("knopf-rot.gif"));
	protected ImageIcon iconNullBackground2   = new ImageIcon(Jukebox.class.getResource("knopf-gelb.gif"));
	
	protected ImageIcon iconNullMousepressed = new ImageIcon(Jukebox.class.getResource("knopf-rot-punkt.gif"));
	protected ImageIcon iconNullMousepressed2 = new ImageIcon(Jukebox.class.getResource("knopf-gelb-punkt.gif"));
	
     //// Hintergrundbild zuweisen
	protected ImageIcon iconHintergrund= new ImageIcon(Jukebox.class.getResource("jukeboxversion-b gif.gif"));


	//// Swing-Buttons erzeugen
	protected JButton b0     = new JButton (iconNullBackground);
	protected JButton b1     = new JButton (iconNullBackground);
	protected JButton b2     = new JButton (iconNullBackground);
	protected JButton b3     = new JButton (iconNullBackground2);
	protected JButton b4     = new JButton (iconNullBackground2);
	protected JButton b5     = new JButton (iconNullBackground2);
	

	//// Swing-Label erzeugen
	protected JLabel hintergrund = new JLabel(iconHintergrund);

	//// Swing Textfelder erzeugen	
	protected String ausgabeText="NIX";
	protected JTextField ausgabe= new JTextField(ausgabeText,10);
	

	//// Konstruktor der GUI
	public Jukebox()  
    {
       super();
       setBackground(Color.lightGray);
       setSize(800,600);
       setLocation(0,0);
       setLayout(null); //Kein Layout, alles numerisch definiert
       hintergrund.setBounds(0,0,800,600);
       hintergrund.setOpaque(false);
       
 	
       //Groesse, Positionen, Werte und Icons der randlosen Buttons
	   int butx=279;
	   int buty=287;
	   int butw=17;
	   int buth=17;
       b0.setBounds(butx,buty,butw,buth);
	   b0.setBorder(null);
	   b0.setActionCommand("0");
	   b0.setPressedIcon(iconNullMousepressed);
        
	   int butx1=324;
	   int buty1=287;
	   int butw1=17;
	   int buth1=17;
       b1.setBounds(butx1,buty1,butw1,buth1);
	   b1.setBorder(null);
	   b1.setActionCommand("1");
	   b1.setPressedIcon(iconNullMousepressed);
	

	   int butx2=370;
	   int buty2=287;
	   int butw2=17;
	   int buth2=17;
       b2.setBounds(butx2,buty2,butw2,buth2);
	   b2.setBorder(null);
	   b2.setActionCommand("0");
	   b2.setPressedIcon(iconNullMousepressed);
	   
	   int butx3=425;
	   int buty3=287;
	   int butw3=17;
	   int buth3=17;
       b3.setBounds(butx3,buty3,butw3,buth3);
	   b3.setBorder(null);
	   b3.setActionCommand("1");
	   b3.setPressedIcon(iconNullMousepressed2);
	   
	   int butx4=469;
	   int buty4=287;
	   int butw4=17;
	   int buth4=17;
       b4.setBounds(butx4,buty4,butw4,buth4);
	   b4.setBorder(null);
	   b4.setActionCommand("0");
	   b4.setPressedIcon(iconNullMousepressed2);
	   
	   int butx5=509;
	   int buty5=287;
	   int butw5=17;
	   int buth5=17;
       b5.setBounds(butx5,buty5,butw5,buth5);
	   b5.setBorder(null);
	   b5.setActionCommand("1");
	   b5.setPressedIcon(iconNullMousepressed2);
	   
	   ausgabe.setBackground(Color.lightGray);
	   ausgabe.setHorizontalAlignment(JTextField.RIGHT); 
	   ausgabe.setBorder(null);
       ausgabe.setOpaque(false);
 
       add(b0);
       add(b1);
       add(b2);
       add(b3);
       add(b4);
       add(b5);
       add(ausgabe);
       add(hintergrund); //Wichtig: Hitergrund zum SCHLUSS 

       //// Listener fuer Button-Events und Schliessen
       MiniService buttonService= new MiniService(this);
       b0.addActionListener(buttonService);
       b1.addActionListener(buttonService);
       b2.addActionListener(buttonService);
       b3.addActionListener(buttonService);
       b4.addActionListener(buttonService);
       b5.addActionListener(buttonService);
       
       addWindowListener(new SchliessMenueFensterAdapter());

    }
}
```


----------



## tagedieb (14. Jan 2011)

just_steffi hat gesagt.:
			
		

> Die Schwierigkeit besteht nun für mich darin, dass ich es so hinkriegen will, dass wenn ich auf einen der Buttons klicke eine .gif Datei abgespielt werden soll.



???:L

Was genau ist den das Problem? Willst du wissen wie man eine Sound Datei abspielt?

.gif ist eine Grafikdatei. Die kannst du *anzeigen* aber nicht *abspielen*.


----------



## eRaaaa (14. Jan 2011)

Naja, es gibt auch animierte Gif`s, vielleicht meint er die. Die kannst du aber eig. genauso anzeigen wie du jetzt auch schon machst. ImageIcon über Jukebox.class.getResource laden und dann einem JLabel hinzufügen, das sollte eig. klappen.
Ansonsten kann man solche Animationen auch selbst zeichnen, z.B. mit dem Graphics Objekt in der paintComponent und drawImage...






(http://java.sun.com/products/jfc/tsc/articles/swing2d/WatermarkDemo/duke_anim.gif)

Dann müsstest du bei solch einer Datei z.B. immer nur einen Teil zeichnen(das ginge mit der o.g. Methoden ziemlich einfach)

Ansonsten müsstest du nochmal konkreter werden was du genau meinst


----------



## just_steffi (14. Jan 2011)

Hey!
Danke für die Antworten! Ich bin ein Neuling bei Java und kenn mich so gut wie gar nicht aus. Deshalb kann ich mich wohl auch nicht richtig ausdrücken.





Uploaded with ImageShack.us

So sieht meine Jukebox in diesem Moment aus.
Ich will die Schallplatte unten zum drehen bringen sobald man auf einen Knopf oben drückt, welcher Sound abspielt. Ist das verständlicher :S?


----------



## eRaaaa (14. Jan 2011)

Im Moment sind wir ja noch gar nicht bei dem Punkt angekommen wo es Java spezifisch wird anscheinend. Die Frage war ja, hast du schon ein animiertes Gif? Die Schaltplatte dreht sich ja nicht einfach von selbst, das Bild wo sich die Schallplatte z.B. ein Stück weiter bewegt hat als jetzt, muss natürlich existieren ! Ob du das nun eben mit einem animierten Gif machen willst, oder Einzelbilder war dann die zweite Frage (man könnte natürlich auch die gesamte Jukebox in Java selbst malen, würde ich dir aber von abraten  )


----------



## just_steffi (14. Jan 2011)

Ja also ich habe bereits eine .gif Datei von der exakten Schallplatte die sich dreht.


----------



## eRaaaa (14. Jan 2011)

Mhm, wie schon gesagt, eig. sollte das dann gehen. Kannst du mal das Bild(Jukebox) zur Verfügung stellen hier? Evtl. ist im Gif kein delay eingebunden wurden oder ähnliches ???:L:autsch:


----------



## just_steffi (14. Jan 2011)

das bild der jukebox ist eigentlich schon oben. 
aber die schallplatte kann ich nochmal einfügen.
meine frage war eigentlich wie es funktioniert, da ic nicht weiß wie man die gif einbettet un mit den buttons verbindet... wie gesagt ich bin ein neuling ^^


----------



## Grey_M (14. Jan 2011)

Ich würde das spontan so machen.

http://www.java-forum.org/spiele-multimedia-programmierung/88343-gif-splitten.html

Also das Gif einlesen und die einzelnen Bilder in ein Array oder eine Liste packen.
Dann übergibst du diese Liste und alle anderen Infos die du für das Zeichnen brauchst (Koordinaten, Komponente, ...) einem Thread der über einen Button klick gestartet wird.

Der Thread durchläuft dann die Schleife, zeichnet das aktuelle Bild, schläft ungefähr Thread.sleep(40); und zeichnet das nächste Bild.

Irgend ein andere Aktion beendet dann wieder diesen Thread, bzw. deaktiviert das neu zeichnen.

*Edit:* Bzgl. einbinden. Keine Ahnung wie du das Bild da oben malst. Du kannst z.B. das Bild entweder selbst auf den Graphikkontext malen, oder du nimmst einen JButton, setzt als Icon das Image und ersetzt das Icon über den Thread neu.


----------

