# jpeg Bild anzeigen java



## sousou (4. Okt 2009)

hallo ihr lieben,

ich bin dabei, das man ein bild das sich bei mir auf dem Deskop befindet, ganz normal anzuzeigen. Also hab eigentlich null ahnung davon habs jedoch versucht mich da einzuarbeiten und das ist das Ergebnis:



[Java]
package javaapplication4;

import javax.swing.JFrame;


public class Main {


    public static void main(String[] args) {
        // TODO code application logic here

            String titel = "Kosmos Bild";

            ImageViewe p = new ImageViewe(titel);

            JFrame window = new JFrame( );
            window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            window.setSize( p.width, p.height );  // die größe des Fenster, wird mit setSize eingerichtitet das heisst // das bild ist 500 px breit und 600 px high
            window.setVisible(true); // Für setVisible muss ein Objekt des Bildes vom TYP FRAME sein. Der Aufruf von setVisible(true) zeigt das Fenster an.

        p.paint();

    }

}[/code]




```
package javaapplication4;

import java.awt.*;

public class ImageViewe {

            int width = 0;
            int height = 0;

            public ImageViewe(String titel){

                // Super darf nur in einen Konstruktor aufgerufen werden & muss die erste Anweisung sein!
                super(titel);
            }

           public void paint(Graphics g) {

               String filename = "F:\\Users\\Jousef\\Desktop\\yupi.jpg";

               Image img1 = Toolkit.getDefaultToolkit().getImage(filename);
               this.width = img1.getWidth(this);
               this.height = img1.getHeight(this);     

  }
            
}
```


Fehlermeldung ist beispielsweise das mit titel... 

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code
        at javaapplication4.ImageViewe.<init>(ImageViewe.java:14)
        at javaapplication4.Main.main(Main.java:14)
Java Result: 1


Würd mich freuen wenn jemand drauf schaut

lg


----------



## Spin (4. Okt 2009)

Ohje , dein Source Code ist total unsauber und nicht compilierbar , wegen deinen super() und noch ein paar andere Sachen.

Du hast eine Bildanzeige Klasse und eine main.

Du möchtest in deiner Main lediglich das Fenster erstellen lassen und die Instanz deiner anderen Klasse aufrufen. Das geht auch , blo nicht so wie du es gemacht hast.

Warum lädst du es nicht in ein BufferedImage rein?


```
public class ImageViewer extends JFrame
{
public ImageViewer (Image image, String imageTitle)
{
setTitle ("ImageViewer - " + imageTitle);
ImageComponent imageComponent = new ImageComponent (image);
getContentPane().add(imageComponent);
pack();
setResizable(false);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
if (args.length != 1)
{
System.out.println ("Falsche Nutzung!");
System.out.println ("Das Programm soll mit einer Bilddatei");
System.out.println ("als Argument aufgerufen werden.");
System.out.println ("Leerzeichen im Namen der Bilddatei");
System.out.println ("können auch zu diesem Fehler führen.");
System.exit(1);
}
try
{
File imageFile = new File (args[0]);
BufferedImage image = ImageIO.read(imageFile);
if (image == null)
{
System.out.println ("Bild konnte nicht dekodiert werden!");
System.exit(1);
}
String imageTitle = imageFile.getAbsolutePath();
ImageViewer imageViewer = new ImageViewer (image,imageTitle);
imageViewer.setVisible(true);
}
catch (IOException e)
{
System.out.println ("Datei konnte nicht geladen werden!");
System.exit(1);
}
}
}
```


Das ist ein einfaches Beispiel, was dir das Laden erklärt.
Halt dich nicht an Image Component auf, dass brauchst du nicht.

Es reicht wenn du es in dein Frame hineinlädst.

also trx und catch und laden ins Buffered Image und auf das ContentPane() legen .
grüße


----------



## HoaX (4. Okt 2009)

Also ich sehe da mehrere Fehler, u.a. aber auch, dass du vll. erstmal mit was kleinerem anfangen solltest. Z.B. nem einfachen Fester mit paar Buttons.

Wenn du deinen Code kompilierst dann sollte da genau stehen was in Zeile 14 nicht richtig ist.


----------



## L-ectron-X (4. Okt 2009)

Wenn du super() aufrufst, solltest du auch von einer brauchbaren Klasse geerbt haben.
In deinem Fall funktioniert das nicht, weil deine Klasse automatisch von Object erbt, wenn du explizit keine Klasse angibst. Und Objekt hat keinen Konstruktor, der ein String-Argument erwartet.

[c]ImageViewe p = new ImageViewe();[/c] wäre demnach richtig.
Den Titel übergibst du deinem JFrame: [c]JFrame window = new JFrame(titel);[/c]



> p.paint();


So was vergiss ganz schnell. paint() wird *niemals* vom Programmierer aufgerufen.

Oben habe ich gesagt, dass du, wenn du super() benutzen möchtest, von einer anderen Klasse erben musst.
Deine Klasse ImageViewe soll eine GUI-Komponente sein, die in einem Fenster angezeigt werden soll. In deinem Fall kann das bspw. ein JComponent, ein JLabel oder ein JPanel sein.
Wenn deine GUI-Komponente sich wie ein JPanel verhalten soll, lässt du es von JPanel erben.
[c]public class ImageViewe extends JPanel {[/c] Dabei den Import des richtigen Paketes nicht vergessen.

Wenn du in einer JComponent malen möchtest, musst du die paintComponent()-Methode überschreiben, *nicht* paint().
Als erste Anweisung in einer überschriebenen paintComponent()-Methode sollte immer 
[c]super.paintComponent(g);[/c] stehen, um auch die geerbte Methode aus der Basisklasse aufzurufen. Damit wird schon mal ein Standard-Hintergrund gezeichnet.

Auf das Laden von Bildern in der paint()- bzw. paintComponent()-Methode sollte unbedingt verzichtet werden, weil dieser Vorgang bei jedem Update der GUI erneut durchgeführt werden würde - ein Performance-Disaster...

Das Laden von Bildern in Swing-Applikationen sollte auch nicht mehr über das alte Toolkit erfolgen, sondern über die spezialisierte, effiziente Klasse javax.imageio.ImageIO.

Codebeispiele zur sauberen Lösung deines Problems findest du zur Genüge im Forum.


----------

