Meine JLabels werden nicht angezeigt

Network

Top Contributor
Hallo,

die Überschrift sagt es ja bereits, meine JLabels werden nicht angezeigt.

Mein JLayeredPane enthält 3 JPanels auf jeweils 3 verschiedenen Ebenen. Auf diesen JPanels befinden sich JLabels mit Bildern, und genau diese kann ich nicht sehen!

D.h. weder die Bilder noch wenn ich die JLabels mit "JLabel.setBackground( Color.black )" anmale.

Es bleibt diese Standardfarbe grau-weiss...
Mein Code:
Java:
public class MainFrame extends JFrame {

	private static final long serialVersionUID = 1L;
	
	//Look
	private JPanel jp;
	private 	JScrollPane jspMap;
	private 		JLayeredPane jlpMap;
	private 			JPanel jpBackground;
	private 			JPanel jpPlayground;
	private 			JPanel jpForeground;
	
	//Data
	IOManager io;
	public static final String sFor = "Terrain/Texturen/01.png";
	public static final String sBack = "Terrain/Texturen/bild02.png";
	public static final String sFog = "Terrain/Texturen/bild03.png";

	public MainFrame() { //extends JFrame
		//Data
		io = new IOManager();
		
		//Look
		jp = new JPanel();
		jp.setLayout( new BorderLayout() );
		this.add( jp );
		
		jspMap = new JScrollPane();
		jp.add( jspMap );
		
		//Create workstation
		Dimension mapsize = new Dimension( w*30, h*30 ); //default: w & h = 100
		
		jlpMap = new JLayeredPane();
		jlpMap.setPreferredSize( mapsize );
		
		jpBackground = new JPanel( null );
		jpBackground.setSize( mapsize );
		jpBackground.setOpaque( true );
		jlpMap.add(jpBackground, new Integer(1));
		
		jpPlayground = new JPanel( null );
		jpPlayground.setSize( mapsize );
		jpPlayground.setOpaque( false );
		jlpMap.add(jpPlayground, new Integer(2));
		
		jpForeground = new JPanel( null );
		jpForeground.setSize( mapsize );
		jpForeground.setOpaque( false );
		jlpMap.add(jpForeground, new Integer(3));
		
		for( int row = 0; row < h; row++ ) {
			for( int column = 0; column < w; column++ ) {
				//Create JLabel
				JLabel jlBG = new JLabel();
				jlBG.setIcon( io.loadImageSafety(MainFrame.sBack, true) ); //load image via ImageIO - automatic exception handler
				jlBG.setBounds( 30*column, 30*row, 30, 30 );
				jlBG.setBackground( Color.black );
				jpBackground.add( jlBG );
 			}
		}
		
		jspMap.getViewport().setView( jlpMap );

		//Finalize
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("Geo Conflict - Alpha");
		this.setVisible( true );
		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
	}
}

Währe echt toll wenn das jmd. anschaut... Ich habe echt keine Ahnung warum das nicht funktioniert!

Vielen Dank im Vorraus
Gruß
 
Zuletzt bearbeitet:
setBounds() ist abgesehen vom null-Layout ziemlich uninteressant (edit: ok, hast du ja),
Bilder und Hintergrund sind immer schlechte Tests, fange doch mit "Test"-Text an

passiert das ganze vor oder nach setVisible(true) der GUI?

der Rest der GUI mit jspMap usw. kann auch Probleme machen wenn nicht korrekt,
nur vollständige Testprogramme haben eine gute Aussage


edit:
bei mir gehts:
Java:
public class TestGUI   extends JFrame {
    public TestGUI()   {
        int h = 3;
        int w = 3;
        Dimension mapsize = new Dimension(w * 30, h * 30); // default: w & h = 100

        JLayeredPane jlpMap = new JLayeredPane();
        jlpMap.setPreferredSize(mapsize);

        JPanel jpBackground = new JPanel(null);
        jpBackground.setSize(mapsize);
        jpBackground.setOpaque(true);
        jlpMap.add(jpBackground, new Integer(1));

        JPanel jpPlayground = new JPanel(null);
        jpPlayground.setSize(mapsize);
        jpPlayground.setOpaque(false);
        jlpMap.add(jpPlayground, new Integer(2));

        JPanel jpForeground = new JPanel(null);
        jpForeground.setSize(mapsize);
        jpForeground.setOpaque(false);
        jlpMap.add(jpForeground, new Integer(3));

        for (int row = 0; row < h; row++)    {
            for (int column = 0; column < w; column++)      {
                // Create JLabel
                JLabel jlBG = new JLabel("abc");
                jlBG.setBounds(30 * column, 30 * row, 30, 30);
                jlBG.setBackground(Color.black);
                jpBackground.add(jlBG);
            }
        }

        JScrollPane jspMap = new JScrollPane();
        jspMap.getViewport().setView(jlpMap);


        add(jspMap);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 300);
        setVisible(true);
    }

    public static void main(String[] args)  {
        new TestGUI();
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Ok, danke erstmal. Habe meinen gesammten Code hinzugefügt.

Deinen Code habe ich getestet, Text wird auch angezeigt, aber das setBackground(Color.black) immernoch nicht geschweige denn das Bild.

Das Bild ist vorhanden und beim laden kommt auch keinerlei Exception...
 
jlBG.setOpaque(true);
noch für die Farbe

für die Datei
new File(pfad)
exists(), getAbsolutePath() testen

in jedem Fall nur einmal laden, nicht in der Schleife 10.000x ...
 
Deinen Code habe ich getestet, Text wird auch angezeigt, aber das setBackground(Color.black) immernoch nicht geschweige denn das Bild.
Der Hintergrund eines JLabels ist standardmäßig transparent und muss erst mittels setOpaque(true) sichtbar gemacht werden.
Das Bild ist vorhanden und beim laden kommt auch keinerlei Exception...
Vielleicht liegt's ja daran (beziehe mich auf den Kommentar im Code):
Java:
jlBG.setIcon( io.loadImageSafety(MainFrame.sBack, true) ); //load image via ImageIO - automatic exception handler
 
@Michael und SlaterB
Ok Danke. Ich habe nie bemerkt, das JLabel standardmäßig nicht sichtbar ist.

=> Mein IOManager (mein Standardrepertoire) regelt automatisch, dass ein Bild nur einmal geladen wird und gibt für alle späteren Fälle nur die Adresse des schonmal geladenen Bildes zurück. (Sowie nimmt er einem die lästigen Exceptions fals gewünscht ab.
=> Der Fehler war tatsächlich genau dort drin -.-' warum weiss ich noch nicht. Irgendwie funktioniert das ganze System nicht, wenn ich als "Key" der HashMap (Adressenspeicher der Bilder), Strings statt Files verwende.

Wie dem auch sei. Vielen Dank, man lernt nie aus 🙂
 
selbst wenn nur einmal, dann sind die unnötigen Methodenaufrufe, Pfad nachschlagen und der Code an sich einfach unschön,
irgendwo muss er ja stehen, aber dann zumindest nicht in der kritischen Schleife und nicht so verschachtelt 😉

lieber das Bild in einer Variablen und nur
jlBG.setIcon( iconXy );
 

Neue Themen


Zurück
Oben