JPanel aktualisiert nicht, bis die Größe Jframe
Ich JPanel-Unterklasse zu überschreiben paintComponent(Graphics), ich will zeichnen Sie ein Bild auf jpanel in einem jframe.
Aber mein Bild nicht angezeigt, bis ich eine änderung vornehmen zu jframe Größe.
Das ist mein code:
public class ImagePanel extends JPanel{
public void setImage(BufferedImage bi)
{
image = bi;
revalidate();
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(image != null)
{
g.drawImage(image, 0, 0, this);
}
}
}
InformationsquelleAutor der Frage nautilusvn | 2012-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie sicher, dass Sie aufrufen
setVisible()
nach Komponenten hinzufügen und aufrufenpack()
wie diskutiert in diesem Zusammenhang Beispiel. Man kann auch annehmen müssen, um eine entsprechende layout. Aufrufenrepaint()
wie vorgeschlagen hierbeheben das symptom, aber nicht die zugrunde liegende Ursache.InformationsquelleAutor der Antwort trashgod
Wenn Sie auf "aktualisieren" das JPanel dann sollten Sie rufen repaint(), die nennen Ihre paintComponent(). Das sollte dein problem lösen:
Seine gute Praxis, um zu aktualisieren und ändern Sie die GUI mit dem EDT. Hier ist mehr info über die EDT, wenn Sie interessiert sind:
Wie funktioniert das event-dispatch-thread arbeiten?
repaint
braucht nicht genannt zu werden, von der EDT. Wenn Sie die änderung der GUI, wie das setzen von text in ein JLabel, es sollte innerhalb des EDT. Hier mehr Informationen zu dem, was als außerhalb des EDT (mit freundlicher Genehmigung von schönen Kuh):Sichere Verwendung in der Komponente.repaint() außerhalb EDT?
InformationsquelleAutor der Antwort John
Werfen Sie einen Blick auf die docs für
JPanel.add()
die es erbt vonjava.awt.Container
:Hervorhebung Hinzugefügt.
Daher, wenn Sie ändern einen Container nach es wurde bereits angezeigt, Sie muss nennen
validate()
um es zu zeigen. Aufrufenrepaint()
ist nicht genug. Sie haben vielleicht bemerkt, dass der AufrufsetVisible(true)
auch funktioniert, das ist, weil er ruft dievalidate()
intern.InformationsquelleAutor der Antwort Nateowami
Ich hatte das gleiche problem und es behoben durch Aufruf setVisible-Methode(true); JFrame ich war mit.
Beispiel : wenn Ihr JFrame nicht update nach der Verwendung :
fixieren Sie es mit :
Ich weiß, es klingt dumm, dies zu tun, obwohl Ihr JFrame schon sichtbar ist, aber das ist der einzige Weg den ich bisher gefunden habe, um dieses problem zu lösen (die Lösung oben vorgeschlagen, hat bei mir nicht funktioniert).
Hier ist ein komplettes Beispiel. Führen Sie es und kommentieren Sie die "f.setVisible-Methode(true);" - Anweisungen in den Klassen Panel1 und Panel2 und du wirst den Unterschied sehen. Vergessen Sie nicht, die importiert werden (Strg + Shift + O für automatische Importe).
Main-Klasse :
Panel1 Klasse :
Panel2 Klasse :
Hoffe, das hilft.
Grüße.
InformationsquelleAutor der Antwort user2154283
Ich hatte auch gleiche problem, aber ich habe eine Lösung gefunden. Erstellen Sie einfach eine
jframe
Objekt auf der Oberseite und rufenjframe
Methoden an der Unterseite wiejf.pack()
jf.setVisible()
jf.setSize()
jf.setDefaultCloseOpetion()
sollte an der Unterseite der alle UIs Hinzugefügt in diesem Rahmen werden Sie finden es eine tolle Sache.InformationsquelleAutor der Antwort Harshad Khandagale