# Bild auf JPanel zeichnen



## vannelle (8. Jul 2010)

...auf die Anregung doch einen eigenen Thread zu eröffnen mach ich das mal hier 
(Vorgeschichte HIER)

Zusammenfassung: Auf imagepanel sollen die Images die vorher der ArrayList hinzugefügt werden
untereinander gezeichnet werden.
So wie es jetzt ist, wird leider nix gezeichnet ...

Mein kompletter Code:


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class ImageView extends JFrame implements ActionListener {
	final ArrayList<Image> speicher = new ArrayList<Image>();
	JTextArea ausgabetext;
	JTextField urltext;
	JPanel imagepanel, content;

	public static void main(String[] args) {
		new ImageView();
	}

	public ImageView() {
		super();
		init();
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	private void init() {
		content = new JPanel();
		imagepanel = new JPanel();
		JButton scan = new JButton("Scan URL");
		ausgabetext = new JTextArea(5, 50);
		ausgabetext.setSize(10, 51);
		ausgabetext.setEditable(false);
		urltext = new JTextField(15);
		urltext.setText("http://www.uni-due.de/");

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setViewportView(ausgabetext);

		JScrollPane scrollPane1 = new JScrollPane();
		scrollPane1.setViewportView(imagepanel);

		scan.addActionListener(this);

		content.setPreferredSize(new Dimension(710, 650));
		imagepanel.setPreferredSize(new Dimension(600, 500));
		imagepanel.setBorder(new LineBorder(Color.BLACK, 1));
		content.add(scrollPane1, BorderLayout.CENTER);
		content.add(scan, BorderLayout.CENTER);
		content.add(urltext, BorderLayout.CENTER);
		content.add(scrollPane);
		this.setResizable(false);
		this.setContentPane(content);
		this.pack();
		this.setTitle("Scan URL for images ...");

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		ausgabetext.setText("scanning URL ...\n\n");
		System.out.println("scanning URL ...");
		speicher.clear();
		getImage();
	}

	private void getImage() {
		try {
			String inputLine;
			URL uni = new URL(urltext.getText());
			BufferedReader in = new BufferedReader(new InputStreamReader(uni
					.openStream()));

			while ((inputLine = in.readLine()) != null) {

				Pattern p = Pattern.compile("<img.*src=[\"'](.*?)[\"'].*>");

				Matcher m = p.matcher(inputLine);

				while (m.find() == true) {

					String source = inputLine.substring(m.start(1), m.end(1));
					if (source.substring(0, 1).equalsIgnoreCase("/")) {
						source = "http://www.uni-due.de" + source;
					} else if (!source.substring(0, 7).equalsIgnoreCase(
							"http://")) {
						source = "http://www.uni-due.de/" + source;
					}
					ausgabetext.append(source + "\n");
					System.out.print(source);
					System.out.print("\n");
					speicher.add(ImageIO.read(new URL(source)));
				}
			}

			in.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Feeehhhlleeerrr!!!");
		}
		imagepanel.repaint();
	}

	public void paintComponent(Graphics g) {
		super.paintComponents(g);
		int x = 0, y = 0;
		for (Image image : speicher) {
			g.drawImage(image, x, y, null);
			y += image.getHeight(null);
		}
	}

}
```


Vielen Dank für die Hilfe

Vannelle


----------



## Michael... (8. Jul 2010)

Können den die Bilder überhaupt geladen werden? Du lässt Dir ja die Pfade ausgeben. Wie schauen die aus? Werden die Bilder angezeigt, wenn Du die Pfade in der Adressleiste des Browsers eingibst?
Ist die ArrayListe am Ende überhaupt mit Bildern gefüllt? Gibt's Fehlermeldungen?


----------



## vannelle (8. Jul 2010)

Die Bilder werden als korrekte URL ausgegeben, welche auch die Grafik anzeigt wenn ich sie in der Adresszeile aufrufe.
Das Array ist am Ende auch korrekt mit Image-Objekten befüllt.

//edit: Beim debugging hab ich festgestellt dass die paintComponent garnicht aufgerufen wird?! Nichtmal bei ...repaint()


----------



## Eldorado (8. Jul 2010)

Sehe ich das richtig, dass die paintComponent() Methode zum JFrame und nicht zum imagepanel gehört? Ich schätze mal die Bilder sollten auf dem imagepanel gezeichnet werden oder?


----------



## vannelle (8. Jul 2010)

ja, das kann gut sein 
Ich stehe allerdings auf dem Schlauch, wie ich die dem Imagepanel zuordne ...


----------



## Eldorado (8. Jul 2010)

Dafür musst du eine Klasse schreiben, die von einer JComponent(JPanel) erbt und dann deren paintComponent überschreiben. Hier ein Turorial aus unserem Forum zu dem Thema: http://www.java-forum.org/awt-swing-swt/43939-zeichnen-swing-tutorial.html


----------



## vannelle (8. Jul 2010)

Ahhh ... mir geht ein Licht auf 

Funktioniert jetzt mit dem Zeichnen, allerdings noch ein winziges Problem mit der ScrollPane.
Imagepanel soll in einer Scrollpane liegen, dass falls die Grafiken zu groß/viele sind, trotzdem alle 
angezeigt werden.
Die ScrollPane beim ausgabetext funktioniert ja einwandfrei, aber die scrollPane1 bekommt wohl nicht mit dass das Fenster zu groß ist.
Die Idee war jetzt: 

```
scrollPane1.setViewportView(imagep.getContentPane());
```
oder so ähnlich. Wie ihr wahrscheinlich wisst, gehts nicht so 

In der Hauptklasse:

```
imagep = new ImagePanel(); 
		JScrollPane scrollPane1 = new JScrollPane(imagep);
```

Die ImagePanel Klasse:

```
public class ImagePanel extends JPanel{
	public ImagePanel() {
		this.setPreferredSize(new Dimension(600, 200));
	}


	public void paintComponent(Graphics g) {
		super.paintComponents(g);
		int x = 0, y = 0;
		for (Image image : ImageView.speicher) {
			g.drawImage(image, x, y, null);
			y += image.getHeight(null);
		}
	}
}
```


----------



## Michael... (8. Jul 2010)

Du musst die PreferredSize abhängig von den eingefügten Bildern setzen.


----------



## vannelle (9. Jul 2010)

Da mich nichts mehr nervt als Forenthemen bei welchen die endgültige Lösung nicht zu finden ist,
hier mein Ergebnis (allerdings noch ohne ScrollPane):

in der Mainklasse:

```
imagep = new ImagePanel();
```

Klasse in der gezeichnet wird:

```
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JPanel;

public class ImagePanel extends JPanel {
	int x = 0, y = 0;
	public ImagePanel() {
		this.setPreferredSize(new Dimension(600, 600));
	}

	public void paintComponent(Graphics g) {
		super.paintComponents(g);	
		for (Image image : ImageView.speicher) {
			g.drawImage(image, x, y, null);
			y += image.getHeight(null);
		}

	}
}
```


----------



## eRaaaa (9. Jul 2010)

[java=14]
super.paintComponent(g); //ohne s hinten 
[/code]



(vllt wäre es auch besser die Liste dem Panel "einzureichen" im Konstruktor)


----------

