Nicht alle Bilder werden angezeigt

Feld

Mitglied
Ich möchte eine einfache sache machen - einfach 15 Bilder in einem GridLayout mit 3 zeilen und 5 spalten anzeigen. -Aber es funktioniert nicht ganz - vielleicht kann jemand mir sagen was da falsch läuft:

Am Anfang erstelle ich die Bilder einzeln - je Bild auf ein JPanel geklatscht:

Java:
public class Bild extends JPanel
{
//bla bla
public void paint(Graphics g)
    {
        g.drawImage( bild, 0, 0, DIM.width, DIM.height, this );
    }
}

Auf jeden fall es funktioniert. Dann erstelle ich eine Liste mit allen Bildern ( insgesamt 10 verschiedene )

Java:
public class Walze
{
	private ArrayList < Bild > walze = null;
	
	public Walze ( )
	{
		walze = new ArrayList < Bild >( );
		for ( byte i = 0; i < ANZAHL; ++i )
		{
		    walze.add( new Bild( ADDRESSES[i] ) );
		    walze.get( i ).setNumber( i );
              }
     }
     public Bild getBild ( byte num )
	{
		return walze.get( num );
	}
// bla bla
}

Dies funktioniert auch - auf die methode von Bild setNumber( ) werde ich noch zu sprechen kommen - jedes Bild bekommt einfach nur ein nummber ( von 0 bis 9 ).

Wann ich jetzt diese klasse ausgebe, einfach die Bilder nacheinander von 0 bis 9 zu JFrame hinzufüge, dann funktioniert es einwandfrei.

Jedoch nach noch ein paar Klassen, wo nur die einzelne Bilder ausgewählt und in bestimmten Reihenfolgen geordnet, funktioniert die Ausgabe nicht mehr.

Hier die stelle ab der es nicht mehr funktioniert:

Java:
public class ShowBilder extends javax.swing.JPanel
{
	private Automat auto;
	
	public ShowBilder ( ) // DIM ist eine Dimension, rest einfach byte Konstante
	{
		auto = new Automat( );
		this.setPreferredSize( new Dimension ( ( DIM.width * REIHEN ), ( DIM.height * 3 ) ) );
		this.setLayout( new GridLayout ( 0, REIHEN ) ); // REIHEN == 5
		this.setVisible( true );
		
		shaubild( );
	}
	
	private void shaubild ( )
	{
		this.removeAll( );
		
		ArrayList<Bild> bild = auto.getBilder( ); // gibt die 15 Bilder zurück
		for ( byte spalte = 0; spalte < bild.size( ); ++spalte )
		{
			this.add( new JLabel( String.valueOf( bild.get( spalte ).getNumber( ))));
			//this.add( bild.get( spalte ), -1 );
		}
	}
}
So bekomme ich genau so wie gewollt die 15 nummern ( mit setNumber( ) am Anfang zugewiesen ), in genau richtiger Reihenfolge und an genau richtigen stellen.

Wenn ich jetzt die zeile auskommentiere
Java:
this.add( new JLabel( String.valueOf( bild.get( spalte ).getNumber( ))));
und dafür
Java:
this.add( bild.get( spalte ), -1 );
einfüge, dann sehe ich nur die ersten 8 Bilder und das wars. ( ob, mit -1 oder ohne in add( bild.get( spalte ), -1 ); )

Die Ausgabe selbst ist einfach ein JFrame, zu dem die ShowBilder Jpanel hinzugefügt wird
Java:
public static void main( String[ ] args )
	{
		JFrame f = new JFrame( );
		ShowBilder shows = new ShowBilder( );
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.getContentPane( ).add( shows );
		
		f.setAlwaysOnTop( true );
		f.pack( );
		f.setBounds( 50, 300, shows.getWidth( ), shows.getHeight( ) );
		f.setVisible( true );
	}

Ich verstehe gar nicht wie es möglich ist - es kann einfach nicht ein Nummer ohne dazugehörigen Bild existieren - diese werden ja zusammen gesetzt. Dazu kann ich die Bilder alle ausgeben - also werdne diese richtig erstellt und nummeriert. Wenn es an irgendeiner stelle früher was schief laufen würde, wäre die nummerierung auch falsch - aber diese ist richtig, an den richtigen stellen, in richtiger größe - alles passt.

Wie kann es jetzt sein das die Nummerierung der Bilder angezeigt wird, aber die Bilder nur zu hälfte?
 
Zuletzt bearbeitet:
Zu allererst solltest du in Bild statt der paint()- die paintComponent()-Methode überschreiben.
Also einfach nur umbenennen.
Ich habe mir den restlichen Code nicht weiter angesehen, aber vielleicht hilft das schon.
Wenn nicht, suchen wir weiter.

Interessant ist auch der Code, wo du die Bilder lädst. den habe ich nicht gefunden...
 
Mit paintComponent Methode hat sich gar nicht geändert.

Wie gesagt, die Bilder werden richtig geladen, ich kann alle ausgeben
Java:
bild = ImageIO.read(new File(adresse));
Das ist nur 1 zeile. adresse im dem Fall ist ein String
 

Zurück
Oben