# GUI-Bilder einfügen



## Basti4231 (19. Apr 2010)

Hallo Leute,

ich habe jetzt hier schon mehrere Beiträge zu diesem Thema gelesen, aber ich habe es nicht geschafft, damit mein Problem zu lösen.
Mein einfaches Ziel ist es, ein Bild in meine grafische Oberfläche einzufügen und zwar auf der Position Center.

Hier mal ein bisschen Code:


```
package layouts;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GuiMitAktion implements ActionListener {
    JButton button;

    public void los() {
        JFrame frame = new JFrame();
        button = new JButton("Zufallsliste ausgeben.");
        Font bigFont = new Font("serif", Font.TRUETYPE_FONT, 15);
        button.setFont(bigFont);
        button.addActionListener(this);
        ImageIcon myfile = new ImageIcon("Pfad des Bildes"); 
        JLabel lab = new JLabel((myfile));
        frame.getContentPane().add(BorderLayout.CENTER, lab);
        frame.getContentPane().add(BorderLayout.NORTH, button);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(550, 300);
        frame.setVisible(true);

    }

    public void actionPerformed(ActionEvent event) {
        ZufallsListen zufall = new ZufallsListen();
        String s = zufall.mixeListen();
        button.setText(s);

           }
}
```


Mein aktuelles Problem besteht darin, dass zur Zeit kein Bild angezeigt wird - dieses hat die Maße 90x90 und ist vom Typ .bmp. Der Pfad des Bildes, den ich hier aus privaten Gründen nicht anzeige, ist aber korrekt. 

Vielen Dank schonmal für positive Beiträge 

Basti


----------



## Michael... (19. Apr 2010)

Basti4231 hat gesagt.:


> Der Pfad des Bildes ... ist aber korrekt.


Wenn dem so ist, müsste das Bild eigentlich angezeigt werden.
Lass doch mal folgendens ausgeben:

```
System.out.println(new File("Pfad des Bildes").exists());
```
Wenn das Bild innerhalb eines Packages liegt, sollte man es eher so laden:

```
new ImageIcon(getClass().getResource("/package/pfad/meinBild.png"));
```


----------



## Basti4231 (19. Apr 2010)

Komisch, dass bei mir false ausgegeben wird. Zur Überprüfung des Pfades habe ich gerade das Bild rechtsgeklickt, Eigenschaften, den Ort kopiert, den Namen des Bildes mit der Endung .bmp hinzugefügt, das Ergebnis bleibt false.
Danach änderte ich den Typ in .jpg per Paint, dann den Pfad als Endung .jpg, gleiches Ergebnis - false. Ich verstehe das nicht...


----------



## w0ddes (19. Apr 2010)

Also das ist wirklich komisch. 
Ist das Bild schreibgeschützt oder sowas?


----------



## Basti4231 (19. Apr 2010)

Das Bild ist ohne Umwege normal mit Paint erstellt, den Namen habe ich auch gerade geändert zum Test. Einfach anstatt "d" ein "D" daraus gemacht, aber das Ergebnis änderte sich nicht. 
Die Datei hat keinen Kopierschutz, keinen Schreibschutz oder sonstiges.
Sehr merkwürdig.


----------



## w0ddes (19. Apr 2010)

Was mir grade einfällt: Was haben Strings in Java als "Endzeichen" (Das "Zeichen", das das Ende des Strings signalisiert)?   In C wäre das ja z.B.  
	
	
	
	





```
\0
```

vllt hast du sowas ja in deinem Dateipfad (durch Zufall) angegeben und er liest den String nicht bis zum Ende ..


----------



## Basti4231 (19. Apr 2010)

```
ImageIcon myfile = new ImageIcon(
                "C:\\Dokumente und Einstellungen\\Basti4231\\Desktop\\Deck.jpg");
```

Das ist der aktuelle Code.


----------



## w0ddes (19. Apr 2010)

Also ich hab das ganze in nem Projekt von mir so gemacht: 


```
... = new ImageIcon("images/logo/Bild.gif");
```

Das Bild befindet sich halt im Projektordner im Ordner "images" im Unterordner "logo" und ich benutze auch Windows. 
Mein Vorschlag wäre: Ersetze einfach  mal die "\\" durch "/"


----------



## Basti4231 (19. Apr 2010)

Es wird immernoch false geliefert. Ist es möglich, dass 90x90 einfach nicht passt?

Basti


----------



## w0ddes (19. Apr 2010)

wir reden hier grade ja nur von: 

```
System.out.println(new File("C:/Dokumente und Einstellungen/Basti4231/Desktop/Deck.jpg").exists());
```
  liefert false? 

Dieser Aufruf testet ja nur ob das Bild überhaupt "existiert", die Größe spielt dabei keine Rolle.

EDIT: Okay, unter Windows is der Pfad "C:\\Dokumente und Einstellungen\\Basti4231\\Desktop\\Deck.jpg" schon richtig geschrieben.. glaube der nächste Beitrag könnte helfen ..


----------



## eRaaaa (19. Apr 2010)

/edit: man sollte richtig lesen.. ;/


----------



## Basti4231 (19. Apr 2010)

Dadurch wird keine Änderung hervorgerufen.


----------



## srea (19. Apr 2010)

Wenn die Methode .exists() false zurückgibt hat das ja auch nix mit dem frame, dem label oder sonstwas zu tun sondern die Datei gibt es einfach nicht bzw er kann nicht darauf zugreifen. Das heisst man muss den Fehler beim Pfad oder hier in der Gegend suchen.


----------



## Basti4231 (19. Apr 2010)

Ja das ist logisch, dass es irgendwas mit dem Bild, oder dem Pfad selber zu tun haben muss.
Aber bisher gibt es noch keine Erklärung dafür.


----------



## srea (19. Apr 2010)

Womit programmierst du? Führst du die IDE (falls benutzt) als Administrator aus?


----------



## Michael... (19. Apr 2010)

Das mit dem Layout passt schon.
Versuch mal vorher das Bild per FileChooser auszuwählen, wenn das funktioniert dann liegt's an der Pfadangabe:

```
JFileChooser fc = new JFileChooser();
fc.showOpenDialog(null);
JLabel label = new JLabel(new ImageIcon(fc.getSelectedFile().getAbsolutePath()));
```


----------



## Basti4231 (19. Apr 2010)

Also damit bekomme ich ein Fenster wo ich dann den Pfad auswählen muss, wie erwartet. Ich wähle die Datei aus, die sich auf dem Desktop mit Deck.jpg befindet, bestätige dies mit OK. Danach bekomme ich wiederum die nette Anzeige "false".


----------



## w0ddes (19. Apr 2010)

Um nochmal auf "srea"'s Beitrag zu kommen:  Benutzt du Eclipse oder ähnliches? Führst du die Programmierumgebung als Admin aus?


----------



## Basti4231 (19. Apr 2010)

Ich habe eingeschränkte Rechte (Ich weiß nicht genau, was so alles nicht unter mein Recht fällt, was ich tun kann), denn ich bin nur ein User in einem Netzwerk.
Desweitern benutze ich Eclipse SE.


----------



## w0ddes (19. Apr 2010)

Das könnte das Problem sein, dürfte es aber nicht. Ich arbeit hier in der Firma auch mit eingeschränktem Konto (Windows XP) und Eclipse aber ich kann ohne Probleme auf Dateien zugreifen ..


----------



## Basti4231 (19. Apr 2010)

Im Grunde genommen kann ich ja auch zugreifen ohne Problem. Ich kann alles mit dem Bild machen, was mir lieb ist. Aber anscheinend geht doch irgendwas nicht, ich weiß nicht womit es zusammen hängen könnte. Echt merkwürdig das ganze


----------



## w0ddes (19. Apr 2010)

Das bringt mich irgendwie auch voll aus dem Konzept .. ich versteh' nicht woran das liegen könnte ...


----------



## Michael... (19. Apr 2010)

Basti4231 hat gesagt.:


> Ich wähle die Datei aus, die sich auf dem Desktop mit Deck.jpg befindet, bestätige dies mit OK. Danach bekomme ich wiederum die nette Anzeige "false".


Das finde ich ein bisschen merkwürdig. Wie schaut den der Code drumherum aus bzw. hast Du mal versucht das Bild aus einem anderen Verzeichnis heraus zu laden?


----------



## Basti4231 (19. Apr 2010)

Habe auch versucht mal von Eigene Dateien zu laden, kein Erfolg -.-


----------



## w0ddes (19. Apr 2010)

Also das ist echt komisch.. 

Wenn du mal ne "testklasse" (siehe nachfolgend) machst, liefert die wirklich false?! 

```
import java.io.File;

public class foo {

	public static void main(String[] args) {
		System.out.println(new File("C:\\Dokumente und Einstellungen\\Basti4231\\Desktop\\Deck.jpg").exists());

	}

}
```
 liefert false?


----------



## Basti4231 (19. Apr 2010)

Es wird immer noch genauso "false" geliefert.
Die Datei ist aber auf dem Desktop, sie  heißt auch so, wie im Pfadnamen angegeben.


----------



## w0ddes (19. Apr 2010)

Okay, ich bin raus. Hab keine Ahnung woran das liegt. 
Wahrscheinlich ist's wieder so ein total doofer, kleiner Fehler den aber keiner findet.

Sorry


----------



## Basti4231 (19. Apr 2010)

Basti4231 hat gesagt.:


> Es wird immer noch genauso "false" geliefert.
> Die Datei ist aber auf dem Desktop, sie  heißt auch so, wie im Pfadnamen angegeben.



Sehr komischerweise habe ich ein wenig rumgewurschtelt, keinen Plan, was genau jetzt anders ist, aber es klappt xD, in der Foo-Klasse wird nun true geliefert. Problemchen - das Bild wird nicht angezeigt.


----------



## w0ddes (19. Apr 2010)

Also in meiner Foo Klasse kann nichts angezeigt werden.. Der prüft wirklich nur, ob die Datei existiert, mehr nicht


----------



## Basti4231 (19. Apr 2010)

Er findet mein Bild aber jetzt, er liefert true.

Hier ist jetzt der aktuelle Code von mir, vielleicht habe ich im Laufe der Zeit einen "Wurschtelfehler" gemacht.


```
package layouts;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GuiMitAktion implements ActionListener {
    JButton button;

    public void los() {
        JFrame frame = new JFrame();
        button = new JButton("Zufallsliste ausgeben.");
        Font bigFont = new Font("serif", Font.TRUETYPE_FONT, 15);
        button.setFont(bigFont);
        button.addActionListener(this);
        // ImageIcon myfile = new ImageIcon(
        // "C:\\Dokumente und Einstellungen\\SeHoffma\\Desktop\\Deck.jpg");
        // JLabel lab = new JLabel((myfile));
        JFileChooser fc = new JFileChooser();
        fc.showOpenDialog(null);
        JLabel label = new JLabel(new ImageIcon(fc.getSelectedFile()
                .getAbsolutePath()));
        frame.getContentPane().add(BorderLayout.CENTER, label);
        frame.getContentPane().add(BorderLayout.NORTH, button);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(550, 300);
        frame.setVisible(true);
        System.out.println(new File(
                "C:\\Dokumente und Einstellungen\\SeHoffma\\Desktop\\Deck.jpg")
                .exists());

    }

    public void actionPerformed(ActionEvent event) {
        ZufallsListen zufall = new ZufallsListen();
        String s = zufall.mixeListen();
        button.setText(s);

    }
}
```


----------



## Basti4231 (19. Apr 2010)

w0ddes hat gesagt.:


> Also in meiner Foo Klasse kann nichts angezeigt werden.. Der prüft wirklich nur, ob die Datei existiert, mehr nicht



Ich glaube du hast mich falsch verstanden, denn ich meinte gleichzeitig, dass ich den Code angepasst habe und diesen ausgeführt habe, es ist mir auch klar, dass in einer so winzigen Foo-Klasse keine Gui mit passendem Bild von selbst sich ausführt


----------



## Sonecc (19. Apr 2010)

Zugriff geht eigentlich immer, auch mit eingeschränkten rechten, nur das ändern ist nicht zwingend möglich.


----------



## Basti4231 (19. Apr 2010)

Das bedeutet, dass ich quasi das Bild für diesen Zweck eigentlich verwenden kann.
Aber irgendwas im Code, oder irgendeine technische Sache verhindert meinen Erfolg bislang ^^


----------



## w0ddes (19. Apr 2010)

Also am Code selbst find ich jetzt nichts .. Liegt aber vllt auch daran, dass ich den ganzen tag schon wieder nur Code sehe  
Vllt sieht ja jemand was!

Edit: Vllt mal 
	
	
	
	





```
JLabel.setOpaque(true);
```
  oder die Size des Labels auf 90x90 setzen


----------



## Michael... (19. Apr 2010)

Dein Code oben sollte eigentlich funktionieren. Versuch mal, ob das Bild sichtbar wird, wenn Du das Fenster kleiner oder grösser ziehst.


----------



## Basti4231 (19. Apr 2010)

Also das setzen der Labels hat keine Wirkung und wo ich die Methode von dir hinsetzen sollte im Code weiß ich auch nicht, wenn ich es einfach so in der Methode public void los() verwende kommt ein Fehler: "Cannot make a static reference to ther non-static method setOpaque(boolean) from the type JComponent"


----------



## Michael... (19. Apr 2010)

Die Methode musst Du an einem Labelobjekt aufrufen. Sollte aber in Deinem Fall uninteressant sein, da damit nur festgelegt wird, ob der Komponentenhintergrund transparent ist oder nicht.

kannst höchstens mal setOpaque(true) und setBackground(Color.GREEN) an Deinem JLabel aufrufen, um festzustellen, ob das richtige JLabel auf der GUI verwendet wird. Aber wenn Dein Code so wie oben beschrieben ausschaut, gibt's ja nur ein JLabel.


----------



## Basti4231 (19. Apr 2010)

Das hilft auch nicht weiter, zwar ist jetz das Label hässlich stechend grün, aber mehr auch nicht :lol:


----------



## Michael... (19. Apr 2010)

Naja, jetzt hast Du wenigstens die Gewissheit, dass das richtige Label angezeigt wird ;-)

Ich habe jetzt mal Zeile 27 bis 31 bei mir ausprobiert und es funktioniert...
Was für  Betriebssystem nutzt Du denn?


----------



## srea (19. Apr 2010)

Hast du mal dein Bild kleiner (also nicht von der Dateigröße sondern die "eigentliche" Größe) gemacht? Oder ne andere Endung versucht?
Ich hab bei mir mal ein wenig rumgespielt und hatte das selbe problem. Als ich dann das Bild kleiner gemacht hab gings.
Erklären kann ich mir das ganze nicht, probiers mal bitte aus.


----------



## Basti4231 (20. Apr 2010)

Ich hatte gestern noch ausprobiert, Bilder aus meinem "Eigene Bilder"- Ordner zu laden. 
Siehe da: Es hat geklappt xD
Als ich mein Bild Deck.jpg dorthin verschoben habe, klappte es natürlich nicht. Als ich die Größe auf die des Bildes, bei dem es funktionierte, änderte, wollte sich das Bild nicht zeigen ^^

Ich habe noch ein anderes Problem, was sich mir beim Einlesen einer .CSV-Datei ergab. Ich denke aber ich sollte ein neues topic dafür öffnen...


----------

