Fotos aus Flickr in Gui einbinden

Edgar2010

Mitglied
Hallo ich habe folgendes Problem und zwar importiere ich durch einen REST Aufruf Fotos aus Flickr und möchte sie in einer Gui anzeigen lassen , es funktioniert das 1 foto angezeigt wird aber nicht mehrere. Hier mal der Code
Code:
public 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 filewriter = new FileWriter(new File("Photos.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) { 
            
        	filewriter.append(nextline);
     
            
            // Zeigt mir als String alle Fotos mit Attributen an
            System.out.println(nextline);
        }
        dis.close();
        filewriter.close();
        
        String filename = "Photos.xml";
        XMLInputFactory factory = XMLInputFactory.newInstance();
        //System.out.println("FACTORY: " + factory);

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

            XMLEvent event = reader.nextEvent();
            if (event.isStartElement()) {
                StartElement element = (StartElement) event;
                String elementName = element.getName().toString();
                if (elementName.equals("photo")) {
                    i++;
                   
					Iterator<Attribute> 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;
                        }
                    }
                        String flickrurl = "http://static.flickr.com/" + servers[i] + "/" + ids[i] + "_" + secrets[i] + ".jpg";	
                        URL u = new URL(flickrurl);
                        ArrayList<URL> list=new ArrayList<URL>();
                        list.add(u);
                        System.out.println(u);
                        return list;
                    }
                  }
               }

Und hier die Gui Klasse
Code:
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();
		
		//URL url;
		List<URL> imgList = photo.fetchImage();
        //Iterator<URL> it= imgList.iterator();
        //while(it.hasNext()){
        	
        //url=it.next();
        //java.net.URL where = url;
        //ImageIcon icon = new ImageIcon(where);

        //System.out.println(url);
		
		JLabel label1=new JLabel(new ImageIcon(imgList.get(0)));
		//JLabel label2=new JLabel(new ImageIcon(imgList.get(1)));
		//label1.setIcon(icon);
		    	    
		panel1.add(label1);
		//panel1.add(label2);
	
		cont.add(panel1,BorderLayout.SOUTH);
        }
	// }      
		        	
	
	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(600, 600);
                app.setVisible(true);
                app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }
	    	
}

Bin für jede Hilfe dankbar. Das Problem muss in der ersten Klasse liegen.
 

Fabio Hellmann

Erfahrenes Mitglied
Hi und Willkommen bei Tutorials.de,

das Problem was du hast, liegt daran, dass du auf dein 'panel1' kein Layout gesetzt hast. Als default wird glaube ich ein Layout ausgewählt, dass den Inhalt ausfüllt. Sprich wenn du ein zweites Bild in einem neuen JLabel auf das JPanel setzt, wird das erste einfach in den Hintergrund gesetzt/gelöscht.

Gruß

Fabio
 

Edgar2010

Mitglied
Hi danke für die Antwort was meinst du mit Layout setzen? Ich weiß schon das ich mehere Labels benötige um sie in ein Panel zu setzen aber es ist so das mir im Code in der ersten Klasse nur eine URL in die Liste geladen wird und nicht wie angegeben 10 !
 

Fabio Hellmann

Erfahrenes Mitglied
Also für die Layouts schaust du dir am besten den Link mal an.
Das in der Liste nur eine URL enthalten ist, wird höchstwahrscheinlich hier dran liegen:
Java:
                        String flickrurl = "http://static.flickr.com/" + servers[i] + "/" + ids[i] + "_" + secrets[i] + ".jpg"; 
                        URL u = new URL(flickrurl);
                        ArrayList<URL> list=new ArrayList<URL>();
                        list.add(u);
                        System.out.println(u);
                        return list;
Da du hier die Liste erzeugst und nur eine URL ('u') hinzufügst.

ps.: Bitte verwende die Java-Tags, wenn du Code postest.
 
S

SE

Willkommen beim Tutorials.de
Da du noch neu bist nehme ich es dir nicht übel das du unsere Java-Tags nicht kennst ...
In meiner Signatur kannst du deren Verwendung sehen. Warum sind diese besser als CODE-Tags ? Weil du dadurch Syntax-Highlightning hast was die Lesbarkeit enorm erhöt.

Dessweiteren ist dein Code etwas ... nun ... schlecht formatiert was weiter hinderlich ist.

Zum Problem selbst :
Du hast hier einen dicken Struktur Fehler : du erstellst innerhalb der while() ein neues List-Objekt. Das ist schon mal falsch ! Wenn dann müsstest du diese List AUßERHALB der while() erstellen um sie nicht immer wieder zu überschreiben. Und dann machst du gleich den Folgefehler das du diese List , welche zu diesem Zeitpunkt eben nur einen Eintrag enthält dierekt returnst. Dein Code hat also nicht mal die Möglichkeit einen zweiten Eintrag hinzuzufügen ... ganz davon abgesehen das du dann immer wieder eine neue List erzeugen würdest welche von außerhalb der while() nicht mal sichtbar wäre.

Nach einer re-formatierung und mit richtigen Java-Tags hier mal die Stelle die ich meine

Java:
while(reader.hasNext())
{
	XMLEvent event=reader.nextEvent();
	if(event.isStartElement())
	{
		StartElement element=(StartElement)event;
		String elementName=element.getName().toString();
		if(elementName.equals("photo"))
		{
			i++;
			Iterator<Attribute> iterator=element.getAttributes();
			while(iterator.hasNext())
			{
				Attribute attribute=(Attribute)iterator.next();
				QName name=attribute.getName();
				String value=attribute.getValue();
				if((name.toString()).equals("server"))
				{
					servers[i]=value;
				}
				if((name.toString()).equals("id"))
				{
					ids[i]=value;
				}
				if((name.toString()).equals("secret"))
				{
					secrets[i]=value;
				}
			}
			String flickrurl="http://static.flickr.com/"+servers[i]+"/"+ids[i]+"_"+secrets[i]+".jpg";
			URL u=new URL(flickrurl);
			ArrayList<URL> list=new ArrayList<URL>(); //erzeugen eines NEUEN List-Objektes bei JEDEM Schleifendurchlauf
			list.add(u); //immer nur EINEN Eintrag adden
			System.out.println(u);
			return list; //dierektes returnen der ERSTEN Liste mit EINEM Eintrag
		}
	}
}

Das ist so komplett falsch und führt natürlich nicht zu dem gewünschten Ergenis.
Ich habe hier mal eine korrigierte Variante die das returnen sollte was du haben willst *auch habe ich die letzte fehlende Block-Klammer hinzugefügt.

Java:
public 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 filewriter = new FileWriter(new File("Photos.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)
	{
		filewriter.append(nextline);
		System.out.println(nextline);
	}
	dis.close();
	filewriter.close();
	String filename="Photos.xml";
	XMLInputFactory factory=XMLInputFactory.newInstance();
	XMLEventReader reader=factory.createXMLEventReader(filename, new FileInputStream(filename));
	int i=0;
	ArrayList<URL> list=new ArrayList<URL>(); //List AUßERHALB der while() damit du auch erstmal überhaupt Zugriff hast , dazu nur EIN List-Objekt
	while(reader.hasNext())
	{
		XMLEvent event=reader.nextEvent();
		if(event.isStartElement())
		{
			StartElement element=(StartElement)event;
			String elementName=element.getName().toString();
			if(elementName.equals("photo"))
			{
				i++;
				Iterator<Attribute> iterator=element.getAttributes();
				while(iterator.hasNext())
				{
					Attribute attribute=(Attribute)iterator.next();
					QName name=attribute.getName();
					String value=attribute.getValue();
					if((name.toString()).equals("server"))
					{
						servers[i]=value;
					}
					if((name.toString()).equals("id"))
					{
						ids[i]=value;
					}
					if((name.toString()).equals("secret"))
					{
						secrets[i]=value;
					}
				}
				String flickrurl="http://static.flickr.com/"+servers[i]+"/"+ids[i]+"_"+secrets[i]+".jpg";
				URL u=new URL(flickrurl);
				list.add(u);
				System.out.println(u);
			}
		}
	}
	return list; //return erst wenn die List komplett erstellt wurde
}

Wie du siehst habe ich mir auch die Mühe gemacht deinen Code gemäß den Konventionen zu formatieren.

Ich hoffe das hilft dir bei der Lösung des Problems. Und ich hoffe auch das du diesen Fehler verstehst und WARUM deine Variante zu dem Fehler geführt hat. Wenn nicht : dann scheue dich nicht nach zu fragen ... wir erklären es dir gerne.
 

Fabio Hellmann

Erfahrenes Mitglied
Versuchs mal bitte so. Ich kann nicht dafür garantieren, dass es so klappt, aber ich bin der Meinung, dass da das Problem liegt:

Java:
	public 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 filewriter = new FileWriter(new File("Photos.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) { 

			filewriter.append(nextline);


			// Zeigt mir als String alle Fotos mit Attributen an
			System.out.println(nextline);
		}
		dis.close();
		filewriter.close();

		String filename = "Photos.xml";
		XMLInputFactory factory = XMLInputFactory.newInstance();
		//System.out.println("FACTORY: " + factory);

		XMLEventReader reader = factory.createXMLEventReader(filename, new FileInputStream(filename));
		int i = 0;
		ArrayList<URL> list=new ArrayList<URL>();
		while (reader.hasNext()) {

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

					Iterator<Attribute> 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;
						}
					}
					String flickrurl = "http://static.flickr.com/" + servers[i] + "/" + ids[i] + "_" + secrets[i] + ".jpg"; 
					URL u = new URL(flickrurl);
					list.add(u);
					System.out.println(u);
				}
			}
		}
		return list;
	}

// EDIT: Spike war schneller ;)
 
S

SE

Immer diese verdammten SAME-TIME-Posts xD

Was mir gerade auffällt :
Was zur hölle soll das hier eigentlich ?
Java:
Iterator<Attribute> iterator=element.getAttributes();
while(iterator.hasNext())
{
	Attribute attribute=(Attribute)iterator.next();
	QName name=attribute.getName();
	String value=attribute.getValue();
	if((name.toString()).equals("server"))
	{
		servers[i]=value;
	}
	if((name.toString()).equals("id"))
	{
		ids[i]=value;
	}
	if((name.toString()).equals("secret"))
	{
		secrets[i]=value;
	}
}
Mal davon abgesehen das "i" außerhalb ALLER schleifen erstellt wird hat das doch so überhaupt keinen Sinn. Aber erlich : da ich nicht weis wie dein Code arbeitet bin ich auch gerade zu faul dir das zu korrigieren.
 

Edgar2010

Mitglied
Vielen vielen Dank das sieht ja super aus :) super Forum seit zwei Stunden such ich nach der Lösung :) wenn ihr mir jetzt noch verratet wie mir die Bilder es sind 10 Stück in meiner Gui angezeigt bekomme ist heute ein toller Tag :)
 

Edgar2010

Mitglied
Das soll bedeuten das aus meinem XML Dokument die IDs Secrets... ausgelesen werden sollen damit ich daraus eine URL erhalte um die Fotos darzustellen weil die liegen ja auch dem Server von Flickr
 

Neue Beiträge