Swing Bild wird nie angezeigt, egal mit welcher Methode!

Status
Nicht offen für weitere Antworten.
Hallo,
habe mich schon durch die vielen Beträge gearbeitet, wo immer das selbe Problem besprochen wrd: Ein Bild wird nicht angezeigt. Ich habe nun so gut wie alle Möglichkeiten ausprobiert, die in diesen Threads vorgeschlagen werden, aber bei mir wird es wirklich NIE angezeigt. Egal was ich mache - ich sehe nichts 🙁

Ich würde das ganze gern so einfach wie möglich haben und mich nicht ewig an etwas aufhalten wollen, was eigentlich nur hübsche Dekoration sein soll (mein Bild hat eben einfach nur da zu sein ^^)
Also hab ich nochmals zum JLabel gegriffen:

Java:
private JLabel lblBild = new JLabel();
private ImageIcon logo = new ImageIcon("Logo.JPG");

...

lblBild.setIcon(logo);
cp.add(lblBild);
//cp ist mein Container

So ist zumindest auch immer der Quellcode, der in den anderen Threads vorgeschlagen wird. Warum aber funktioniert er bei mir nicht?
Mein Container hat Layout null. Alle Buttons und ne JList und Text und alles wird angezeigt. Nur eben das Bild nicht.
Habe ich eine Kleinigkeit vergessen/übersehen?

Wäre toll, wenn ihr mir helfen könnt, das Problem doch noch zu lösen 🙂

Gruß,
Steffi
 
Wer weiß, vielleicht hast du ja noch mehr vergessen...
Das ist der Grund, warum wir gerne kompilierbare Dateien haben möchten. So lässt sich der Fehler viel schneller finden.

Nach dem, was du geschrieben hast, könnte es auch daran liegen, dass du noch keine Dimensionen für dein Label festgelegt hast. NullLayout ist aber fast immer ein "Fehler". Man benutzt es nicht, weil es mehr Probleme macht, als es löst.

Am besten postest du noch mal den kompletten Quellcode.
 
Java:
GUI(){

setSize(1150, 700);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);

Container cp = getContentPane();
cp.setLayout(null);

lblBild.setBounds(5, 5, 500, 100);
lblBild.setIcon(logo);
cp.add(lblBild);
...
}

Das wäre dann wohl der relevante Teil des Quellcodes(Davor natürlich noch das, was ich im Startpost schrieb: private blabla).
Danach kommen nur noch Button und ihre Funktionen, die alle bevor ich mit dem Bild angefangen habe, super funktioniert haben.

mhm :-/


Verwende ich aber nicht das NullLayout baut der mir das alles um, sodass nichts mehr da erscheint, wos eigentlich hinsollte.
 
Du solltest dich unbedingt mit LayoutManagern befassen, ohne die sich keine ordentliche GUI erstellen lässt.
Um das vorliegende Problem zu lösen, sollte es genügen, den Aufruf der setVisible()-Methode ans Ende des Konstruktors zu stellen.
 
Hallo!
Also die setVisible Methode ändert rein gar nichts.
Kann das Bild immer noch nicht sehen.

🙁

Ist es denn möglich, den LayoutManager jetzt im Nachhinein anders zu wählen, ohne, dass ich die ganzen Komponenten neu ordnen muss? Ich werd mich wohl doch mal durch das Kapitel grasen.

Gruß,
Steffi
 
Also die setVisible Methode ändert rein gar nichts.
Kann das Bild immer noch nicht sehen.
Gibts eine Fehlermeldung?

Ist es denn möglich, den LayoutManager jetzt im Nachhinein anders zu wählen, ohne, dass ich die ganzen Komponenten neu ordnen muss?
Nein. Jeder LayoutManager verfolgt eine andere Strategie beim Anordnen der Komponenten. Du kommst nicht drum herum, diese Stategien zu erlernen, wenn du ordentliche GUIs schreiben willst.
 
Es gibt keine Fehlermeldung. Nichts. Absolut nichts.
Es wird einfach nicht angezeigt.

Hm, das ist natürlich jetzt wirklich doof. Bei meinem nächsten Projekt werd ich das tun, aber mein jetziges würd ich schon gern noch retten ;-)
Gibt es noch eine andere Möglichkeit ein Bild im JFrame einzufügen?

Ich könnte es doch theoretisch als Hintergrundbild bauen und dieses dann im Background anzeigen lassen. Würde das "so einfach" funktionieren?
Dann könnte ich aufs JLabel verzichten, oder?
 
Versuch nicht Probleme vor dir herzuschieben

Poste mal MEHR Code, dann kann man dir sicher besser helfen.
Ein KSKB hilft ungemein (Maus über KSKB, falls du nicht weisst, was es heisst 😉 )

Haste mal Tutorials in der Hinsicht bearbeitet?
Bei dir scheint es teilweise an Grundlagenwissen zu fehlen.

mfg Verjigorm
 
Sowas wie
Code:
File file = new File("Logo.jpg");
System.out.println("Gibt's das? "+file.exists());
könnte auch interessant sein (ich müßte nachsehen, aber glaube, das ImageIcon beschwert sich nicht, wenn es das Bild nicht findet?!)
 
Ich könnte es doch theoretisch als Hintergrundbild bauen und dieses dann im Background anzeigen lassen. Würde das "so einfach" funktionieren?
Dann könnte ich aufs JLabel verzichten, oder?

Das würde mit einem JLabel in diesem Fall auch gar nicht funktionieren, weil es eine Komponente ist, die keine weiteren Komponenten aufnehmen kann.
Du müsstest also ein JPanel benutzen, in dessen Hintergrund das Bild malen und in dieses Panel deine GUI-Komponenten setzen.

Ein einfaches Beispiel sieht so aus:

Panel für Hintergrundbilder
Java:
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.imageio.*;

public class BackgroundPanel extends JPanel {
   private BufferedImage bg;

   public BackgroundPanel(String name) {
      try {
         bg = ImageIO.read(getClass().getResource(name));
         setPreferredSize(new Dimension(bg.getWidth(), bg.getHeight()));
      }
      catch(IllegalArgumentException iae) {
         JOptionPane.showMessageDialog(this,
            "Das Hintergrundbild konnte nicht gefunden werden!",
            "java.lang.IllegalArgumentException",
            JOptionPane.ERROR_MESSAGE);
      }
      catch(IOException ioe) {
         JOptionPane.showMessageDialog(this,
            "Das Hintergrundbild konnte nicht geladen werden!",
            "java.io.IOException",
            JOptionPane.ERROR_MESSAGE);
      }
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      if(bg != null) {
         g.drawImage(bg, 0, 0, this);
      }
   }
}

Ein Frame welcher den Inhalt der GUI aufnimmt
Java:
import java.awt.*;
import javax.swing.*;

public class MainFrame extends JFrame {
   private BackgroundPanel bgPanel;
   
   public MainFrame(String title) {
      super(title);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      bgPanel = new BackgroundPanel("kaefer.jpg");
      bgPanel.setBorder(BorderFactory.createEmptyBorder(40, 40, 40, 40));
      bgPanel.setLayout(new GridLayout(0, 2, 30, 30));
      bgPanel.add(new JButton("Eins"));
      bgPanel.add(new JButton("Zwei"));
      bgPanel.add(new JButton("Drei"));
      bgPanel.add(new JButton("Vier"));
      bgPanel.add(new JButton("Fünf"));
      
      add(bgPanel);
      
      pack();
      setLocationRelativeTo(null);
   }
   
   public static void main(String[] args) {
      new MainFrame("Hintergrundbild-DEMO").setVisible(true);
   }
}

Ausprobieren mit folgender ausführbaren Jar-Datei:
 
Ähmm.... Vielen lieben Dank für eure Hilfe!!!!

...das ist jetzt wirklich peinlich ^^ Ich habe einen winzig kleinen Tippfehler beim Pfad des Bildes gemacht... den hab ich nie bemerkt.
Oh mein Gott! 😀
Na ja, Anfänger eben...

@Marco13: Das hat den Ausschlag gegeben, was denkst du, wie ich geguckt hab, als der mir "false" ausgab ^^


Nichtsdestotrotz werde ich mich dann auch mal mit den Layouts beschäftigen!
Vielen Dank nochmal!

Grüße,
Steffi
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben