Grafik wird nur einmal angezeigt

cleanAir

Mitglied
Hallo,

ich habe gerade ein Beispiel (aus einem bekannten Javabuch) für das einbinden von Bildern in ein Frame abgetippt.
Es sollen laut Beispiel, 4 mal die selbe Grafik angezeigt werden. Es wird aber nur einmal die Grafik angezeigt.

Ich habe genau das geliche Problem auch in meiner GUI. Auch hier wird nur eine Grafik pro JPanel angezeigt.
Weiß einer von euch etwas davon


Code:
import java.awt.*;
import java.awt.event.*;

public class testPanel extends Frame{

    public testPanel(){
        super("hbajsbas");
        
        setBackground(Color.lightGray);
        setSize(800,600);
        setVisible(true);
        setLayout(new GridLayout(2,2));
        add(new ImgShowComponent("iswear.jpg"));
        add(new ImgShowComponent("iswear.jpg"));
        add(new ImgShowComponent("iswear.jpg"));
        add(new ImgShowComponent("iswear.jpg"));
        pack();
    addWindowListener(new WindowAdapter() {
        @Override
          public void windowClosing(WindowEvent evt) {
               System.exit(0);
          }
    } );
    }
}



Hier noch die main mit dem Aufruf:
Code:
public class Main{

    public static void main(String[] args) {
        testPanel hwej = new testPanel();
        
    }
}
 
Ich glaube dir nicht, dass du das genauso aus dem Buch abgetippt hast :P

So, zu deinem Problem: Frame verwendet standardmäßig das BorderLayout, wenn du also nur
Java:
add(new ImgShowComponent("iswear.jpg"));
aufrufst, dann wird die Komponente in den Center-Bereich hinzugefügt. Die nachfolgenden Aufrufe der add-Methode, wie oben gezeigt, sorgen also lediglich dafür, dass die alte Komponente durch eine neue ersetzt wird und das erklärt auch, warum du nur ein Bild siehst. In deinem Buch wurde bestimmt vorher das GridLayout verwendet oder auch ein anderes, aber GridLayout macht an der Stelle Sinn (und außerdem kommt mir das Beispiel irgendwie bekannt vor o.O).

Füg einfach vor den Aufrufen der add-Methode folgende Zeile hinzu:
Java:
setLayout(new GridLayout(2, 2));

Nun sollte das klappen.
 
Zuletzt bearbeitet:
Hi!
@Akeshihiro
Du hast dich da wohl ein bisschen verguckt. Clearnair nutzt in seinem Beispiel das GridLayout, und das ist auch schon richtig so. Das BorderLayout so wie du es vorschlägst macht keinen Sinn. In einem BorderLayout positioniert man mittels den Konsten wie "CENTER", "EAST", etc. etc.

@CleanAir
Ich glaube dir allerdings auch nicht, dass du das Beispiel so abgetippt hast. Denn Klassennamen in Java beginnen immer mit einem Großbuchstaben. Ausserdem sagst du, du fügst in dein Frame JPanel Komponenten ein. Auch das ist nicht richtig, da man AWT (d.h. dein Frame) nicht mit Swing (den JPanels) Komponenten mischen sollte. Dein TestPanel sollte vom Typ "JFrame" sein. Korrigiere das mal, und dann sollte es eigentlich klappen. Wenn nicht, ist wahrscheinlich deine ImgShowComponent Klasse dafür verantwortlich. In dem Fall solltest du mal dessen Code posten!

*grüssle*
 
Ok, hab ich mich verguckt *peinlich*

Aber du hast nur zum Teil recht mit dem BorderLayout. Wenn man keinen zweiten Parameter übergibt, der die Position angibt (CENTER, SOUTH, EAST, NORTH, WEST), dann wird automatisch CENTER genommen.

EDIT:
Axo, du meinstes wohl meinen Korrekturvorschlag ... Da hab ich wohl nicht nachgedacht, was ich da tippe, habs geändert.

Ich glaube ich sollte nix posten, wenn ich Kopfschmerzen hab -.-
 
Zuletzt bearbeitet:
Aber du hast nur zum Teil recht mit dem BorderLayout. Wenn man keinen zweiten Parameter übergibt, der die Position angibt (CENTER, SOUTH, EAST, NORTH, WEST), dann wird automatisch CENTER genommen.

Habe ja auch nicht behauptet, dass es ein MUSS ist, die Komponenten mittels der Direction Konstanten hinzuzufügen. Aber sinnlos, da sie ohne diese Angaben dann wieder alle übereinander lägen ;)

Edit: Ja nun haben wir uns fast verstanden. Das GridLayout macht nämlich schon Sinn. Darin sollte der Fehler nicht liegen. Des Rätsles Lösung müsste aber wie ich schon vermutet habe in de mischung von AWT und SWING liegen, bzw in der ImageKomponente selbst..

*grüssle*
 
Zuletzt bearbeitet:
Jaja, hab mich ja korrigiert :P

So, ich hab nochmal den Code überflogen und mir sind da paar komischen Sachen aufgefallen. Zum einen wird mittels setSize() eine Fenstergröße festgelegt, anschließend aber pack() aufgerufen, was sinnfrei ist, da die Wirkung von setSize() außer Kraft gesetzt wird, denn pack() setzt die Größe entsprechend der Komponenten. Dann ist mir noch aufgefallen, dass das Fenster erst sichtbar gemacht wird, anschlißend das Layout gesezt wird und dann erst die Komponenten hinzugefügt werden, aber kein Versuch unternommen wird die Komponenten bzw. das Fenster neu zeichnen zu lassen. Ob das der Fehler ist, weiß ich nicht, aber setVisible() wird sinnvollerweise als letzte Anweisung angegeben bzw. erst nachdem die Komponenten schon hinzugefügt wurden. Wenn das Fenster sichtbar gemacht wird und erst anschlißend Komponenten hinzugefügt werden, dann sind diese nicht sichtbar.
 
Hallo,
danke für die Antworten.

Zum Frame/JPanel "Problem" in meine Code verwende ich sehr wohl den Frame!
Nur die Methode heißt "testPanel" und könnte auch "Heinz" heißen.

Zu der "nicht abgetippt" Unterstellung: Natürlich habe ich einige Namen angepasst, was die Funktionalität nicht sonderlich beeindrucken sollte. Die Aufrufe und Befehle solten identisch sein.

Hier nochmal der Code (nach gaaanz unten scrollen) für alle anderen Zweifler:
http://www.addison-wesley.de/Service/Krueger/kap24001.htm
 
Zuletzt bearbeitet:
Zum Frame/JPanel "Problem" in meine Code verwende ich sehr wohl den Frame!

Ich weis dass du einen Frame nutzt. Die Frame Klasse ist aber aus dem AWT Paket. Und du sagst, du fügst JPanels hinzu, welche aus dem Swing Paket kommen. Diese sind nicht wirklich zueinander kompatibel. Deshalb solltest du statt einem JPanel ein Canvas nutzen, oder statt dem Frame ein JFrame.

Nur die Methode heißt "testPanel" und könnte auch "Heinz" heißen.
[klugsch.. Modus]
Hierbei handelt es sich aber nicht um einen Methodenname, sondern um den Name der neuen Klasse.... ;)
[/klugsch.. Modus]

*grüssle*
 
Ich wusste, dass ich das Beispiel kenne und jetzt weiß ich auch woher, ich hab mir vor zwei Jahren Javabuch gekauft und es komplett durchgearbeitet ^^

Ok, ob nun abgetippt oder nicht, könntest du uns einen Screenshot von deinem Programmfenster zeigen? Vielleicht kommen wir so auf einen möglichen Fehler.
 
Zurück