Mehrere Bilder laden

javaanf

Mitglied
Hallo,

und zwar möchte ich gerne aus einem ordner alle bilder laden.
jedes bild muss genau an eine bestimmte stelle geladen werden, denn die einzelnen bilder ergeben zusammen ein größeres bild. zu jedem bild gibt es noch eine datei die sagt wo es sich befindet (koordinaten zum zugehörigem bild).

ordner auswählen und so kriege ich hin.

meine frage wäre jetzt wie kriege ich die bilder neben- bzw. untereinander vorzugsweise auf eine zeichenfläche, da ich die zeichenfläche bzw. dessen inhalt verschieben und hereinzoomen will.

für eure hilfe wäre ich dankbar.
 
Wir können die Bilder auf ein BufferedImage malen, welches wir dann in paintComponent auf ein JPanel malen. Hier nur ansatzweise etwas Code:
Java:
class PicturePanel extends JPanel {
...
    img = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = img.createGraphics();
    ...
    g2.drawImage(image, coords[i].x, coords[i].y, 100, 100, null);
    ...
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
    }
...
}
Hier noch ein funktionierendes Beispiel:
Java:
/*
 * ImageDemo.java
 * 1. Select a file from the file chooser
 * 2. Four pictures out of the parent directory are displayed
 */
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class ImageDemo extends JFrame {

    public ImageDemo() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        add(new PicturePanel());
    }

    public static void main(final String... args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new ImageDemo().setVisible(true);
            }
        });
    }
}

class PicturePanel extends JPanel {

    private BufferedImage img;
    private Point[] coords = {new Point(0, 0), new Point(100, 0),
        new Point(0, 100), new Point(100, 100),
        new Point(0, 200), new Point(100, 200)};
    private String[] fileTypes = {".jpg", ".png", ".bmp", ".gif"};

    public PicturePanel() {
        img = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();
        File dir = null;
        JFileChooser fileChooser = new JFileChooser();
        switch (fileChooser.showOpenDialog(null)) {
            case JFileChooser.APPROVE_OPTION:
                dir = fileChooser.getSelectedFile().getParentFile();
                break;
            case JFileChooser.CANCEL_OPTION:
                break;
        }
        if (dir != null) {
            File[] listFiles = dir.listFiles();
            int i = 0;
            for (File file : listFiles) {
                if (isPictureFile(file.getName())) {
                    try {
                        BufferedImage image = ImageIO.read(file);
                        g2.drawImage(image, coords[i].x, coords[i].y, 100, 100, fileChooser);
                        i++;
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
                if (i == 4) {
                    break;
                }

            }
        }
        g2.dispose();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
    }

    private boolean isPictureFile(final String filename) {
        for (String type : fileTypes) {
            if(filename.toLowerCase().endsWith(type)){
                return true;
            }
        }
        return false;
    }
}
 
Zuletzt bearbeitet:
Hallo,
vielen Dank für deine Hilfe.
Habs hinbekommen.

Jetzt hab ich nur noch ein Problem wie kann ich eine Scrollbar in der Zeichenfläche anzeigen lassen.
Ich hab eine Textarea eingebaut und da Funktioniert es. Nur bei der Zeichenfläche eben nicht.

Hier für die Textarea wo es funktioniert:
Java:
//      Textarea - - - - - - - - - - - - -  - -
		getContentPane().add(oPanel,BorderLayout.EAST);
		oPanel.add(ta);
		
		JScrollPane js2 = new JScrollPane();
		js2.getViewport().setView(ta);
		getContentPane().add(js2,BorderLayout.EAST);
		validate();
	}

Hier für die Zeichenflaeche wo es nicht funktioniert
Java:
//      Zeichenflaeche		
		getContentPane().add(cPanel,BorderLayout.CENTER);
		cPanel.setBackground(Color.BLACK);
		
		JScrollPane js1 = new JScrollPane();
		js1.getViewport().setView(cPanel);
		getContentPane().add(js1);
		validate();

zusätzlich habe ich noch:

Java:
//	Panels - - - - - - - - - - - - - - - - -
		JPanel nPanel = new JPanel();
		JPanel oPanel = new JPanel();
		JPanel sPanel = new JPanel();
		JPanel wPanel = new JPanel();
		ZeichenFlaeche cPanel = new ZeichenFlaeche();
		
		
//      Textarea - - - - - - - - - - - - -  - -
		JTextArea ta = new JTextArea (30,15);	


//      Oberflächer erzeugen		
		add(nPanel,BorderLayout.NORTH);
		add(oPanel,BorderLayout.EAST);
		add(sPanel,BorderLayout.SOUTH);
		add(wPanel,BorderLayout.WEST);
		add(cPanel,BorderLayout.CENTER);
 
Du musst das cPanel nicht der ContentPane hinzufügen, sondern nur der JScrollPane.
Java:
JScrollPane js1 = new JScrollPane(cPanel);
getContentPane.add(js1,BorderLayout.CENTER);

Wie sieht denn die Klasse ZeichenFlaeche aus? Wie ist die Preferred/MinimumSize.
 
Hallo,
hab jetzt ab geändert. es geht aber immer noch nicht

Java:
//      Zeichenflaeche		
		getContentPane().add(cPanel,BorderLayout.CENTER);
		cPanel.setBackground(Color.BLACK);
		
		JScrollPane js1 = new JScrollPane(cPanel);
		getContentPane().add(js1,BorderLayout.CENTER);
		validate();

Java:
	class ZeichenFlaeche extends JPanel{
								
			public void paintComponent (Graphics g) {

			super.paintComponent (g); //immer erst Aufrufen
			
		        if (files != null) {
		            
		            for (int i = 0; i < files.length; i++) {
		                
		                    try {
		                        BufferedImage bild = ImageIO.read(files[i]);
		                        g.drawImage((Image)bild, i*60, i*53, 100, 100, this);
		                        i++;
		                    } catch (IOException ex) {
		                        ex.printStackTrace();
		                    }
		                

		 
		            }
		        }

		}
	}

Was meinst du mit Preferred/MinimumSize?
 
Beim ersten Code Fragment ist Zeile 2 unnötig. Zeile 7 nur, wenn das Fenster bereits sichtbar ist, sonst kannst du die auch löschen.

Wenn du dein Fenster verkleinerst, wird auch das cPanel verkleinert. Wenn es so weit verkleinert wird, dass nicht mehr alles sichtbar ist, dann erst, wird die JScrollBar sichtbar. Aber deine Komponente lässt sich beliebig verkleinern ohne, dass die bevorzugte Grösse unterschritten und die Scrollbar sichtbar würde. Die bevorzugte Grösse kannst du mit setPreferredSize definieren: [c]cPanel.setPreferredSize(new Dimension(300,200));[/c] oder wieviel auch immer.
 
Darstellung und Laden

Java:
public void setMy(double sy) {
		this.sy = sy;
	}

	public void setMx(double sx) {
		this.sx = sx;
	}

	public int getXn() {
		return xb;
	}

	public int getYn() {
		return yb;
	}

	private BufferedImage img;
	private Graphics2D g2;

	private String[] fileTypes = { ".bmp" };

	public Kacheln() {
		
		File dir = null;
		JFileChooser fileChooser = new JFileChooser();

		switch (fileChooser.showOpenDialog(null)) {
		case JFileChooser.APPROVE_OPTION:

			dir = fileChooser.getSelectedFile().getParentFile();
			dir2 = dir.list();

			break;
		case JFileChooser.CANCEL_OPTION:
			System.exit(0);
			break;
		}

		if (dir != null) {
			File[] listFiles = dir.listFiles();

			int l = 0;
			try {
				for (l = 0; l < dir2.length; l = l + 2) {

					String s1 = dir2[l].toString().substring(0,
							dir2[l].toString().length() - 3);
					String s2 = dir2[l + 1].toString().substring(0,
							dir2[l + 1].toString().length() - 3);

					if (s1.equals(s2)) {
						
					} else {
						JOptionPane.showMessageDialog();
						System.exit(0);
					}
				}
			} catch (Exception ex) {
				JOptionPane.showMessageDialog();
				System.exit(0);
			}

			for (int i = 0; i < dir2.length; i++)
				if ((dir2[i]).endsWith(".txt"))
				{
					Viewmosaik pn = new Viewmosaik();
					BufferedReader br;
					String s;

					try {
						    	br = new BufferedReader(new FileReader(dir.getPath()
								+ "/" + dir2[i]));

						while ((s = br.readLine()) != null) {

						
							  String aa = s; String bb = br.readLine(); String
							  cc = br.readLine(); String dd = br.readLine();
							  String ee = br.readLine(); String ff =
							  br.readLine();
							  
							  pn.setA(Double.parseDouble(aa));
							  pn.setB(Double.parseDouble(bb));
							  pn.setC(Double.parseDouble(cc));
							  pn.setD(Double.parseDouble(dd));
							  pn.setR((Double.parseDouble(ee)));
							  pn.setH((Double.parseDouble(ff)));
							

						viewif.add(pn);
						}
						br.close();

					} 
					catch (IOException io) {
						System.out.println(io.getMessage());
						JOptionPane.showMessageDialog();
						System.exit(0);
					}
					;
				}

			int ii = 0;
			int a = dir2.length / 2;
			int aa = listFiles.length;
			aa = aa - 2;
			File jkl = new File(listFiles[aa].toString());
			BufferedImage kln = null;
			try {
				kln = ImageIO.read(jkl);
				System.exit(0);
			e1.printStackTrace();
			}

			viewcoord pp1 = new viewcoord();
			viewcoord ppn = new viewcoord();

			pp1 = (viewcoord) viewif.get(0);
			ppn = (viewcoord) viewif.get(a - 1);
			mausx = pp1.getR();
			mausy = pp1.getH();

			xb = (int) Math.round(ppn.getR() - pp1.getR() + kln.getWidth());
			yb = (int) Math.round(pp1.getH() - ppn.getH() + kln.getHeight());

			img = new BufferedImage(xb, yb, BufferedImage.TYPE_INT_ARGB);
			g2 = img.createGraphics();

			for (File file : listFiles) {
				if (isPictureFile(file.getName())) {
					try {
						BufferedImage image = ImageIO.read(file);

						viewcoord p = new viewcoord();
						viewcoord p1 = new viewcoord();
						p1 = (viewcoord) viewif.get(0);
						p = (viewcoord) viewif.get(ii);

						double r = p.getR() - p1.getR();
						double h = p1.getH() - p.getH();

						double sx = Math.round((image.getWidth() * p.getA()));
						double sy = Math.round((image.getHeight() * -p.getD()));

						g2.drawImage(image, (int) r, (int) h, (int) sx,
								(int) sy, this);

						ii++;
					} catch (IOException ex) {
						JOptionPane.showMessageDialog();
						System.exit(0);
						
					}
				}
			}
		}


Table

Java:
public class Table 
{
	public static  ArrayList viewinf = new ArrayList(); 
	{
	}
	public ArrayList getviewinf() 
	{
		return viewinf;
	}
	public void setViewinf(ArrayList viewinf) 
	{
		viewinf.add(this);
	}

	public static ArrayList table = new ArrayList(); {
	 }

	 public ArrayList getListe() {
		 return table;
	 }

	 public void setListe(ArrayList table) {
		 this.table = table;
	 }

	 public static ArrayList table2 = new ArrayList(); public static ArrayList getListe2() {
			return table2;
		}

	 public  void setListe2(ArrayList table2) {
			table.Table.table2 = table2;
		}		
		
	 public static HashMap map = new HashMap(); 

	 public HashMap getMap() {
		 return map;
 

Zurück
Oben