# Bilddatei mit Filechooser auswählen und anzeigen/impotieren



## Krisch (25. Okt 2006)

Hallo,

ich bin relativ unerfahren in der Programmierung mit Java und habe folgendes Problem:

Ich möchte in meine Applikation ein Bitmap einlesen. Dafür würde ich diese gern mit dem FileChooser auswählen und dann einlesen.

Danach soll die Bilddatei bearbeitbar (Filterung/Transformation) sein, also nicht über ImageIcon laden.

Bisher habe ich folgenden Quelltext "zusammengeschustert", aber das Bild wird nicht sichtbar!



```
final JFileChooser fc = new JFileChooser();	
		  int returnVal = fc.showOpenDialog(desk);
          if (returnVal == JFileChooser.APPROVE_OPTION) {
              File file = fc.getSelectedFile();
          try{
            FileImageInputStream in = new FileImageInputStream(fc.getSelectedFile()); 
			java.awt.image.BufferedImage bild = javax.imageio.ImageIO.read(in);
          }
          catch(IOException e) 
		       { 
		         e.printStackTrace();
		       }    
            }
```


Kann mir Jemand helfen?


----------



## The_S (25. Okt 2006)

ImageIO.read erwartet keinen Stream, sondern einfach nur eine Datei.


----------



## André B. (25. Okt 2006)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> ImageIO.read erwartet keinen Stream, sondern einfach nur eine Datei.


Is zwar umständlich aber eigentlich völlig korrekt: http://java.sun.com/j2se/1.5.0/docs/api/javax/imageio/ImageIO.html#read(javax.imageio.stream.ImageInputStream)


----------



## The_S (26. Okt 2006)

:shock: 

das is ja ma wirklich umständlich. OK, wieder was gelernt  .

back to topic: Wie zeigst du das Bild denn an? Wird eine Exception geworfen?


----------



## Krisch (26. Okt 2006)

Es ist korrekt?

aber warum ist dann in meinem Frame kein bild zu sehen?

oder habt ihr einen vorschlag wie es einfacher geht?!

exception werden nicht ausgeworfen....

ich bin ratlos....


----------



## The_S (26. Okt 2006)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Wie zeigst du das Bild denn an?


----------



## Guest (26. Okt 2006)

ach ich muss es noch zusätzlich anzeigen?
ich dachte das macht der read befehl?
hm...
also muss ich noch einen tracker verwenden? oder was?


----------



## The_S (26. Okt 2006)

lol, du kannst es z. B. in einem JLabel als ImageIcon anzeigen lassen oder die paintComponent Methode einer Swing-Komponente deiner Wahl überschreiben um es anzeigen zu lassen.


----------



## Krisch (26. Okt 2006)

hast du mal einen konkreten quelltext?


----------



## The_S (26. Okt 2006)

Ja, 10000. Findeste alle über die Forensuche oder Google. Eines von ihnen findest du hier:

http://www.java-forum.org/de/viewtopic.php?t=38261&highlight=bild+anzeigen


----------



## Krisch (26. Okt 2006)

ich weiß echt nicht was ich falsch mache....

es wird trotzdem kein bild angezeigt!

vielleicht sollte ich es komplett anders aufziehen!?


----------



## The_S (26. Okt 2006)

keine Ahnung, wie ziehst du es denn auf? Bzw. poste doch mal deinen Code wie du das Bild darstellst. Wäre doch gelacht, wenn wir den Fehler nicht finden


----------



## Krisch (26. Okt 2006)

also hier ist der gesamte Quellcode:


```
package gui;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageInputStream;
import javax.swing.*;



public class DesktopFrame		//Desktopmanager
extends JFrame implements ActionListener
{
  private JDesktopPane desk;
  private Image bild;

  public DesktopFrame()
  {
    super("DesktopFrame");
    this.desk = new JDesktopPane();
    desk.setDesktopManager(new DefaultDesktopManager());
    setContentPane(desk);
    addWindowListener(new WindowClosingAdapter(true));
    JMenuBar menubar = new JMenuBar();
    menubar.add(menua());
    menubar.add(menub());
    menubar.add(menuc());
    setJMenuBar(menubar);
    
  }

  public void addChild(JInternalFrame child, int x, int y)		//ruft die Kinderfenster auf
  {
    child.setLocation(x, y);
    child.setSize(200, 150);
    child.setDefaultCloseOperation(
      JInternalFrame.DISPOSE_ON_CLOSE
    );
    desk.add(child);
    child.setVisible(true);
  }
  
  
  
  public void actionPerformed(ActionEvent event)
  {
	  String cmd = event.getActionCommand();
	  if (cmd.equals("Beenden")){
		  setVisible(false);
		  dispose();
		  System.exit(0);
	  }
	  if (cmd.equals("Neu")){							//Methode um ein neues Fenster zu öffnen
		  setVisible(false);
		  dispose();
		  DesktopFrame desktop = new DesktopFrame();
		  desktop.setLocation(100, 100);
		  desktop.setSize(800, 800);
		  desktop.setVisible(true);
		  
	  }
	  if (cmd.equals("Aus Datei")){
		  //Image bild;
		  File file;
		  final JFileChooser fc = new JFileChooser();	//öffnet einen FileChooser
		  int returnVal = fc.showOpenDialog(desk);
          if (returnVal == JFileChooser.APPROVE_OPTION) {
  
            FileImageInputStream in = new FileImageInputStream(fc.getSelectedFile()); 
			java.awt.image.BufferedImage bild = javax.imageio.ImageIO.read(in);
	  
			
  		}
  }
	  }
  public void paintComponent(Graphics g) {	
		g.drawImage(bild,1,1,this);



  public JMenu menua()
  {
    JMenu datei = new JMenu("Programm");			//Programmmenü
    datei.setMnemonic('D');
    JMenuItem mi;
    //Öffnen
    mi = new JMenuItem("Neu", 'f');
    setCtrlAccelerator(mi, 'O');
    mi.addActionListener(this);
    datei.add(mi);
    mi.setToolTipText("Hier können Sie ein neues Projekt starten");
   
    //Speichern
    mi = new JMenuItem("Speichern", 'p');
    setCtrlAccelerator(mi, 'S');
    mi.addActionListener(this);
    datei.add(mi);
    //Separator
    datei.addSeparator();
    //Beenden
    mi = new JMenuItem("Beenden", 'e');
    setCtrlAccelerator(mi, 'B');
    mi.addActionListener(this);
    mi.setToolTipText("Hier beenden Sie die Applikation");
    datei.add(mi);
    return datei;
    
  }
  
  private JMenu menub()
  {
    JMenu datei = new JMenu("Import");			//Importmenü
    datei.setMnemonic('D');
    JMenuItem mi;
    //Öffnen
    mi = new JMenuItem("Aus Datei", 'd');
    setCtrlAccelerator(mi, 'A');
    mi.addActionListener(this);
    datei.add(mi);
    
    //Speichern
    mi = new JMenuItem("URL", 'u');
    setCtrlAccelerator(mi, 'U');
    mi.addActionListener(this);
    datei.add(mi);
    //Separator
    datei.addSeparator();
    //Beenden
    mi = new JMenuItem("Beenden", 'e');
    setCtrlAccelerator(mi, 'B');
    mi.addActionListener(this);
    datei.add(mi);
    return datei;
  }
  
  
  
  private JMenu menuc()
  {
    JMenu datei = new JMenu("Menü C");			//Dateimenü
    datei.setMnemonic('D');
    JMenuItem mi;
    //Öffnen
    mi = new JMenuItem("Öffnen", 'f');
    setCtrlAccelerator(mi, 'O');
    mi.addActionListener(this);
    datei.add(mi);
    //Speichern
    mi = new JMenuItem("Speichern", 'p');
    setCtrlAccelerator(mi, 'S');
    mi.addActionListener(this);
    datei.add(mi);
    //Separator
    datei.addSeparator();
    //Beenden
    mi = new JMenuItem("Beenden", 'e');
    setCtrlAccelerator(mi, 'B');
    mi.addActionListener(this);
    datei.add(mi);
    return datei;
  }
  

  
  private void setCtrlAccelerator(JMenuItem mi, char acc)
  {
    KeyStroke ks = KeyStroke.getKeyStroke(
      acc, Event.CTRL_MASK
    );
    mi.setAccelerator(ks);
  }
}
```



also das wäre mein frame!?

ach ich weiß auch nicht...

3 Tage versuche ich jetzt schon weiter zu kommen...[/quote]


----------



## The_S (26. Okt 2006)

In Zeile 77 ist ein } zuviel, was in Zeile 80 fehlt.

Ein JFrame hat keine paintComponent sondern nur eine paint MEthode. Bennen die mal um.


----------



## Krisch (26. Okt 2006)

jetzt zeigt er mir in zeile 78 einen Fehler

es wird ein ";" erwartet


----------



## The_S (26. Okt 2006)

sry, dass in Zeile 77 passt, war nur ungünstig formatiert. in Zeile 80 brauchste trotzdem noch eines.


----------



## Krisch (26. Okt 2006)

also jetzt kommen keine Fehlermeldung mehr, ABER es erscheint immernoch kein Bild!

hab ich noch irgendetwas vergessen?


----------



## The_S (26. Okt 2006)

```
import javax.swing.*;
import java.awt.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.*;

public class BildTest extends JFrame {
	
	private BufferedImage image = null;
	
	public BildTest() {
		
		try {
			image = ImageIO.read(new File("C:/Bilder/Login-Icons/ist1_784326_pajaro_tribal.jpg"));
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void paint(Graphics g) {
		g.drawImage(image, 50, 50, null);
	}
	
	public static void main(String[] args) {
		BildTest bt = new BildTest();
		bt.setSize(500, 400);
		bt.setVisible(true);
	}
}
```

Also das klappt bei mir wunderbar.


----------



## Guest (19. Mrz 2007)

Krisch hat gesagt.:
			
		

> also hier ist der gesamte Quellcode:
> 
> 
> ```
> ...


[/quote]


----------

