# Flickr Bilder in Gui Oberfläche



## Stephan2009 (14. Sep 2011)

Hallo zusammen,

ich würde gern wissen wie ich es am besten anstelle das ich Fotos aus Flickr in einer Java Gui anzeigen lassen kann. Bis jetzt ist es so das ich mit dem Rest aufruf der Flickr API nach bestimmten Fotos (Metadaten) suche und speicher mir das Ergebnis als XML. Ich weiß das die Darstellung des Bildes mit Hilfe der ID, Secret, Server im Browser dargestellt werden kann. Mein Ziel ist es aber das alle Fotos (z.B. 10 Stück) in meiner Java Oberfläche angezeigt werden. Füt Hilfe bin ich dankbar.


----------



## Michael... (14. Sep 2011)

Wenn Du die URL der Bilder hast, kannst Du sie einfach mittels ImageIcon(URL url) laden und z.B. in einem JLabel anzeigen.


----------



## Stephan2009 (14. Sep 2011)

Hallo, ich habe zwei Klassen einmal die FlickrPhoto deren Aufgabe es ist per Rest Aufruf die Fotos aufzurufen und ich setze sie am Ende des Codes zusammen als URL siehe hier


```
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Desktop;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.beans.XMLDecoder;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import org.xml.sax.InputSource;

import java.io.*;
import java.net.*;
import java.util.*;

public class FlickrPhoto {
	
	
	public static void main(String args[]) throws Exception{
    	
		 
    	
        URLConnection connection = new URL("http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=a750a873fbd6a892f2965a8601a0a2be&sort=date-posted-asc&per_page=100&tags=Polizei,Feuerwehr&text=Polizei+Love Parade+Feuerwehr+Katastrophen+Unfälle").openConnection();
        
        DataInputStream dis = new DataInputStream(connection.getInputStream());
        
        FileWriter fw = new FileWriter(new File("Hello.xml"));
        
        BufferedReader read=new BufferedReader(new InputStreamReader(dis));
        
        String nextline;
        
        String[] servers = new String[100];
        String[] ids = new String[100];
        String[] secrets = new String[100];
        while ((nextline = read.readLine()) != null) { 
            
        	fw.append(nextline);
     
            
            // Zeigt mir als String alle Fotos mit Attributen an
            System.out.println(nextline);
        }
        dis.close();
        fw.close();
        
        String filename = "Hello.xml";
        XMLInputFactory factory = XMLInputFactory.newInstance();
        System.out.println("FACTORY: " + factory);

        XMLEventReader r = factory.createXMLEventReader(filename, new FileInputStream(filename));
        int i = -1;
        while (r.hasNext()) {

            XMLEvent event = r.nextEvent();
            if (event.isStartElement()) {
                StartElement element = (StartElement) event;
                String elementName = element.getName().toString();
                if (elementName.equals("photo")) {
                    i++;
                    Iterator iterator = element.getAttributes();

                    while (iterator.hasNext()) {

                        Attribute attribute = (Attribute) iterator.next();
                        QName name = attribute.getName();
                        String value = attribute.getValue();
                        System.out.println("Attribute name/value: " + name + "/" + value);
                        if ((name.toString()).equals("server")) {
                            servers[i] = value;
                            System.out.println("Server Value" + servers[0]);
                        }
                        if ((name.toString()).equals("id")) {
                            ids[i] = value;
                        }
                        if ((name.toString()).equals("secret")) {
                            secrets[i] = value;
                        }
                    }
                }
            }
        }
        System.out.println(i);
        String flickrurl = "http://static.flickr.com/" + servers[i] + "/" + ids[i] + "_" + secrets[i] + ".jpg";
        
            // baut die URL aller Fotos zusammen
        	URI uri = new URI(flickrurl);
        	ImageIcon icon=new ImageIcon(flickrurl);
        
    }
}
```

Die zweite Klasse ist die Gui 
	
	
	
	





```
public class PhotoApp extends JFrame{
	
	
	public PhotoApp() {
		super("Aggregierte Fotos aus Flickr");
		
		Container cont=getContentPane();
		// Vorlage
		JPanel panel1=new JPanel();
		
		// Folie auf Vorlage
		JLabel label1=new JLabel();
		    	    
		panel1.add(label1);
	    //Vorlage auf Container
		cont.add(panel1,BorderLayout.CENTER);
	}      
		        	
	
	public static void main(String args[]) {
		
		
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                PhotoApp app = new PhotoApp();
                app.setSize(400, 400);
                app.setVisible(true);
                app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
	    	
}
```

Wie übergebe ich der Gui nun am besten die Bilder ? Viele Dank


----------



## Michael... (14. Sep 2011)

Pack doch das was in FlickrPhoto in der main steckt in eine Methode, welche die URLs oder ImageIcons zurückgibt. Die GUI bekommt oder erzeugt sich eine Instanz dieser Klasse und benutzt die Methode um die URLs oder ImageIcons zu holen. Quick & Dirty wäre diese Methode direkt in der GUI Klasse zu implementieren.


----------



## Stephan2009 (14. Sep 2011)

Danke schonmal für deine Tipps aber ich bin mir noch etwas unschlüssig bei der vorgehensweise, ich habe mit System.out.println probiert alles klappt bei der Ausgabe und er zeigt mir auch die zusammengesetzten Strings als URL aus, wenn ich die im Browser eingebe kommt auch das Foto. Problem ist bei mir 1. wie setz ich die Methode auf bzw welchen Rückgabewert soll sie haben und 2. sollte ich die Strings (URL's) Zwischenspeichern im Array um alle Foto URL's in der Gui anzeigen zu können .


----------



## Michael... (14. Sep 2011)

Stephan2009 hat gesagt.:


> Problem ist bei mir 1. wie setz ich die Methode auf bzw welchen Rückgabewert soll sie haben


liegt an Dir und Deinen Anforderungen die Methode kann ein ImageIcon oder URL zurückliefern oder gleiche alle URLs/ImageIcons als Array bzw. List


Stephan2009 hat gesagt.:


> sollte ich die Strings (URL's) Zwischenspeichern im Array um alle Foto URL's in der Gui anzeigen zu können.


Wäre eine Möglichkeit, vor allem wenn man zu eine späteren Zeitpunkt noch einmal darauf zugreifen will.


----------



## Stephan2009 (14. Sep 2011)

So bin jetzt schonmal einen Schritt weiter und zwar ist hier die Methode der einen Klasse

```
public static ArrayList<URL> fetchImage() throws Exception{
    	
    	URLConnection connection = new URL("http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=a750a873fbd6a892f2965a8601a0a2be&sort=date-posted-asc&per_page=10&tags=Polizei,Feuerwehr&text=Polizei+Love Parade+Feuerwehr+Katastrophen+Unfälle").openConnection();
        
        DataInputStream dis = new DataInputStream(connection.getInputStream());
        
        FileWriter fw = new FileWriter(new File("Hello.xml"));
        
        BufferedReader read=new BufferedReader(new InputStreamReader(dis));
        
        String nextline;
        
        String[] servers = new String[100];
        String[] ids = new String[100];
        String[] secrets = new String[100];
        while ((nextline = read.readLine()) != null) { 
            
        	fw.append(nextline);
     
            
            // Zeigt mir als String alle Fotos mit Attributen an
            System.out.println(nextline);
        }
        dis.close();
        fw.close();
        
        String filename = "Hello.xml";
        XMLInputFactory factory = XMLInputFactory.newInstance();
        //System.out.println("FACTORY: " + factory);

        XMLEventReader r = factory.createXMLEventReader(filename, new FileInputStream(filename));
        int i = 0;
        while (r.hasNext()) {

            XMLEvent event = r.nextEvent();
            if (event.isStartElement()) {
                StartElement element = (StartElement) event;
                String elementName = element.getName().toString();
                if (elementName.equals("photo")) {
                    i++;
                   
					Iterator iterator = element.getAttributes();

                    while (iterator.hasNext()) {

                        Attribute attribute = (Attribute) iterator.next();
                        QName name = attribute.getName();
                        String value = attribute.getValue();
                        //System.out.println("Attribute name/value: " + name + "/" + value);
                        if ((name.toString()).equals("server")) {
                            servers[i] = value;
                            //System.out.println("Server Value" + servers[0]);
                        }
                        if ((name.toString()).equals("id")) {
                            ids[i] = value;
                        }
                        if ((name.toString()).equals("secret")) {
                            secrets[i] = value;
                        }
                    }
                }
            }
        
        //System.out.println(i);
            	
            
        }
		
		String flickrurl = "http://static.flickr.com/" + servers[i] + "/" + ids[i] + "_" + secrets[i] + ".jpg";
        
        // baut die URL aller Fotos zusammen
    	URL u = new URL(flickrurl);
    	
    	ArrayList<URL> list=new ArrayList<URL>();
    	list.add(u);
    	for (int j=0; j<list.size();j++){
    	
    	}
```

Und hier die Gui er zeigt mir zumindest jetzt das Foto als URL an aber nicht das Bild selber wie kann ich das machen 

```
public class PhotoApp extends JFrame{
	
	FlickrPhoto photo=new FlickrPhoto();
	
	
	public PhotoApp() throws Exception  {
		super("Aggregierte Fotos aus Flickr");
		
	    Container cont=getContentPane();
	
		JPanel panel1=new JPanel();
		
		JLabel label1=new JLabel(photo.fetchImage().toString());
		    	    
		panel1.add(label1);
	
		cont.add(panel1,BorderLayout.CENTER);
	
	}      
		        	
	
	public static void main(String args[]) {
		
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                PhotoApp app = null;
				try {
					app = new PhotoApp();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
                app.setSize(400, 400);
                app.setVisible(true);
                app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
```


----------



## Michael... (14. Sep 2011)

Du gibst ja hier eine ArrayList mit nur einer URL zurück. Sollte diese nicht innerhalb der Schleife befüllt werden (statt der Arrays server, ids und secrets)?
In der GUI kannst Du dann natürlich nicht die ArrayList in ein JLabel stecken und die Stringdarstellung nutzt auch nicht viel ;-)
Du musst ja die URLs - z.B. in einer Schleife  - rausholen und JLabels übergeben.
z.B.:

```
...
List<URL> imgList = photo.fetchImage();
...
JLabel label = new JLabel(imgList.get(0));
...
```
um die erste URL der Liste an ein JLabel zu übergeben.


----------



## Stephan2009 (14. Sep 2011)

Versteh ich nicht so ganz wie meinst du das ?


----------



## Michael... (14. Sep 2011)

Stephan2009 hat gesagt.:


> Versteh ich nicht so ganz wie meinst du das ?


Ersetze mal die Zeile 13 der Klasse PhotoApp durch die zwei von mir geposteten Zeilen.
Natürlich muss dann noch 
	
	
	
	





```
label
```
 in 
	
	
	
	





```
label1
```
 umbenannt werden.


----------



## Stephan2009 (14. Sep 2011)

Ja hab ich gemacht aber bekomme bei der Zuweisung an das Label den Fehler das der Konstruktor für das Label undefinert ist


----------



## Michael... (14. Sep 2011)

Sorry, die URL muss natürlich von eine ImageIcon geladen werden - soll ja als Bild dargestellt werden.

```
JLabel label = new JLabel(new ImageIcon(imgList.get(0)));
```


----------



## Stephan2009 (14. Sep 2011)

Vielen Dank es funktioniert , das einzige Problem was ich jetzt noch habe ist das nur 1 Bild angezeigt wird ich aber max 10 angezeigt werden will irgendwo muss ich da noch was falsch haben


----------



## Stephan2009 (15. Sep 2011)

Wäre super wenn du mir nochmal helfen könntest wo mein Fehler liegt


----------



## Michael... (15. Sep 2011)

Zum Anzeigen von zehn Bildern brauchst Du natürlich zehn JLabel.
Allerdings liefert - wie bereits - angemerkt die Methode fetchImage() eine ArrayList mit nur einer URL als Eintrag. Statt die Informationen in den Arrays (s. Post oben) zwischen zu speichern, würde es ja ausreichen eine Variable server, id und secret zu puffern zu nutzen, um dann die URL unmittelbar für jedes Element zu erzeugen und in die Liste einzufügen.

Bei mir ist es mittlerweile über zehn Jahre her, dass ich mich mit Java und XML intensiver auseinandergesetzt habe, aber gibt es da nicht andere Möglichkeiten als mit einer inneren Schleife über die Attribute zu iterieren?
Wenn nein würde ich persönlich da eher RegEx anwenden, aber das dürfte für Dich die Sache wohl eher komplizierter machen.


----------



## Stephan2009 (15. Sep 2011)

Hmm es ist ja so das ich durch den REST Aufruf in der Flickr API festlege das ich zum Beispiel 10 Bilder mit bestimmten Metadaten suche diese werden dann als XML gespeichert. Wenn ich jetzt 100 Bilder anzeigen möchte dann muss ich 100 JLAbels haben?


----------



## Michael... (15. Sep 2011)

Stephan2009 hat gesagt.:


> Wenn ich jetzt 100 Bilder anzeigen möchte dann muss ich 100 JLAbels haben?


Wenn man diese wie Du in JLabels anzeigt: ja.
Bei 100 Bildern könnte man eine JTable nutzen. Meiner Meinung wäre es da aber vernünftiger die Bilder selbst zu zeichnen - je nachdem welche Anforderungen dahinter stecken.


----------



## Stephan2009 (15. Sep 2011)

hmm ok werd mir das mit dem JTable mal anschauen , kannst du mir ein Beispiel geben wie du das meinst mit den Puffern von ID, Secret wie du das meinst


----------



## Michael... (15. Sep 2011)

Kann man nicht direkt per StartElement#getAttributeByName(QName) die gesuchten Attribute auslesen? Dann könnte man sich das Iterieren über alle Attribute sparen.

So in etwa meinte ich das:

```
...
		// Die String Arrays rausschmeißen
		List<URL> urlList = new ArrayList<URL>();
		while (r.hasNext()) {
            XMLEvent event = r.nextEvent();
            if (event.isStartElement()) {
                StartElement element = (StartElement) event;
                String elementName = element.getName().toString();
                if (elementName.equals("photo")) {
                   
                    Iterator iterator = element.getAttributes();
                    
                    // Hier die String Puffer deklarieren
                    String server, id, secret;
                    
                    while (iterator.hasNext()) {
                        Attribute attribute = (Attribute) iterator.next();
                        QName name = attribute.getName();
                        String value = attribute.getValue();
                        
                        if ((name.toString()).equals("server")) 
                            server = value;
                        if ((name.toString()).equals("id")) 
                            id = value;
                        if ((name.toString()).equals("secret"))
                            secret = value;
                        
                        //direktes Erzeugen und Speichern der URL in der List
                        if (server!=null && id!=null && secret!=null) 
                        	urlList.add(new URL("http://static.flickr.com/" + server + "/" + id + "_" + secret + ".jpg"));
                    }
                }
            } 
        }
        ...
```


----------



## Stephan2009 (15. Sep 2011)

Danke für deine Hilfe aber ich bekomme eine Fehlermeldung bei dem Vergleich server!=null , id!=null ... das die Variablen intialisiert werden sollten


----------



## Michael... (15. Sep 2011)

War ja nur so dahin geschrieben...
Man kann (Objekt)Variablen auch mit null initialisieren.

```
String server=null, id=null, secret=null;
```


----------



## Stephan2009 (15. Sep 2011)

Vielen Dank für deine Hilfe ich habs endlich er zeigt mir alle Bilder an in der Gui


----------

