Repaint Problem mit JPanel innerhalb eines anderen JPanel
Frage
Ich zeichne Formen in diesem JPanel
, die auch in einer anderen Haupt JPanel
ist. Bei repaint()
zieht es nur die Formen für eine Millisekunde und dann verschwinden sie. Sie bleiben nicht gemalt, warum?
Meine paintComponent
Methode ist so etwas wie diese
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < reportElements.size(); i++) {
this.reportElements.get(i).display((Graphics2D) pageComponents.get(i).getGraphics());
}
}
Wenn die Eltern ein JEditorPane
mit setEditable()
aktiviert ist, funktioniert es und wir können die Formen sehen, aber wenn es ein JPanel
ist nach einer Millisekunde alles, was ich sehe, ist leer Panels.
Lösung
in diesem Fall, was mit denen geschieht, pageComponents, die kleinen JPanels? Das Mutterplatte nicht gonna Zeichne die Formen auf ihnen ist es?
Ich bin mir nicht sicher, ob ich Ihren Kommentar undertand. Ihr Hauptfeld soll Kind Platten enthält. Die Kindertafeln sollten am Hauptfeld mit einem Layout-Manager hinzugefügt werden. Dann, wenn Schaukel das Hauptfeld neu zu zeichnen entscheidet, wird es auch alle Kinderplatten neu streichen und wiederum die Kindertafeln gibt es Formen neu streichen.
Für das, was ihren Wert Benutzerdefinierte Gemälde Ansätze hat ein funktionierendes Beispiel von Formen auf einer Tafel zeichnen.
Andere Tipps
Sie auf das Graphics-Objekt des JPanel malen sollten es dauerhaft zu sein ... In Ihrem Beispiel, das heißt die Graphics g
...
ultrajohn ist tot auf. Sie müssen die Graphics
verwenden Sie weitergegeben wurden. Lesen Sie weiter für die, warum ...
Java 1.6 die RepaintManager
eingeführt, die die Optimierung der Repaint-Anforderungen unterstützt. Es hat einige subtile Effekte auf die Malerei.
In diesem Fall Sie arbeiten mit mehreren Graphics2D Objekten: die g
in paintComponent
bestanden und dem von dem getGraphics
Aufruf zurückgegebene Wert
Der Repaint Manager hat Sie an dem geben g
zu malen. . Hinweis: diese nicht auf dem Bildschirm malt, sondern auf einem temporären Puffer (vorausgesetzt, das Standard-Double-Buffering)
In der paintComponent
rufen Sie malen auf die erhaltenen Grafiken von getGraphics
der verschiedenen Komponenten. Dies wird den Repaint Manager zu umgehen und direkt auf die ungepufferte Anzeige zu malen.
Wenn paintChildren
zurückkehrt, tritt der RepaintManager
in den Doppelpuffer zu handhaben zu aktualisieren. Es zeichnet die leeren temporären Puffer über den angezeigten Puffer, effektiv zu löschen, was durch die Grafiken gemalt von getGraphics
Objekt erhielt
Es kann sein, dass paintChildren
oder paintBorder
Overdraws sein, was Sie in Ihrer Methode gezeichnet haben. Vielleicht versuchen paint
zwingende statt. Dort haben Sie die volle Kontrolle über das, was auf dem Bauteil gemalt werden, und Sie können selbst entscheiden, ob weiter gar paintComponent
, paintChildren
oder paintBorder
zu nennen.