Bild auf JPanel zeichnen

vannelle

Mitglied
...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:

Java:
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
 
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?
 
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()
 
Zuletzt bearbeitet:
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?
 
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:
Java:
scrollPane1.setViewportView(imagep.getContentPane());
oder so ähnlich. Wie ihr wahrscheinlich wisst, gehts nicht so 😀

In der Hauptklasse:
Java:
		imagep = new ImagePanel(); 
		JScrollPane scrollPane1 = new JScrollPane(imagep);

Die ImagePanel Klasse:
Java:
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);
		}
	}
}
 
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:
Java:
		imagep = new ImagePanel();

Klasse in der gezeichnet wird:
Java:
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);
		}

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

🙂

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

Neue Themen


Zurück
Oben