JPanel neu zeichnen mit repaint

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Folgendes Problem... Ich hab ein Tabbed Pane. Jedesmal wenn ich einen bestimmten Tab anklicke wird ein bestimmtes Panel angezeigt. Panel A enthält einen Button. Wenn ich diesen klicke soll ein Label dem Panel hinzugefügt werden.
Ich nutze also die Methode p.add(new JPanel("Test")); Natürlich wird das so veränderte Panel nicht sofort angezeigt. Aber auch ein repaint ändert da nix dran. Wenn ich jedoch in dem tabbed pane auf einen anderen tab klicke und zu meinem modifizierten zurückkehre, wird das Label bzw. die Labels wenn ich mehrmals geklickt habe, angezeigt. Da klappt es doch auch...

Ich skiziere mal den (Pseudo)Code...

Tabbed Pane u.a.

Code:
...
private p;
this.addTab("Tab1", getJPanel_Tab1());
this.addTab("Tab2", getJPanel_Tab1());
...

In der Methode getJPanel_Tab1

Code:
...
Button b = ...
b.addListener(
    // im listener p verändern
   p.add(new JLabel("test");
   ); 

p = new JPanel()
p.add(b)
...
// nun wird bei klick auf button im panel diesem panel was in der tabbed pane klasse ein field ist
// ein jlabel hinzugefügt

Wie gesagt, wenn ich zwischen den Tabs wechsle, wird dann auch das Label/die Label welche(s) ich durch Buttonklick
erzeugt habe angezeigt.

Auch ein hinzufügen

In der Methode getJPanel_Tab1

Code:
...
Button b = ...
b.addListener(
    // im listener p verändern
   p.add(new JLabel("test");
   ); 

p = new JPanel()
p.add(b)
p.repaint()
Code:
...
// nun wird bei klick auf button im panel diesem panel was in der tabbed pane klasse ein field ist
// ein jlabel hinzugefügt

ändert daran nichts. Hat wer eine Idee?
 

L-ectron-X

Gesperrter Benutzer
Wenn du zur Laufzeit GUI-Komponeten hinzufügst, musst du danach validate() aufrufen und nicht repaint().
 
G

Gast

Gast
Hallo,

danke für die Antwort... Ja, das klappt. Aber die Frage: Wo liegt da der Unterschied? D.h. was nützt dann repaint?
 

Ebenius

Top Contributor
Laut API-Doc:
  • public void repaint() : Repaints this component.
  • public void validate() : Ensures that this component has a valid layout. This method is primarily intended to operate on instances of Container.

Repaint ist also das einfache Neuzeichnen (zum Beispiel, wenn Du die Hintergrundfarbe änderst, wird automatisch repaint() benutzt). Validate wird benutzt, wenn sich das Layout (also die Aufteilung der Komponenten) ändert. Wenn die Komponente invalid ist (siehe invalidate()) wird nach dem nächsten validate()-Aufruf das Layout neu aufgebaut.

Hilft das? Grüße, Ebenius
 

Verjigorm

Top Contributor
Wenn du Layout veränderst, also irgendwelche Komponenten hinzufügst/entfernst, musst du dem Layoutmamager sagen, dass er sich bemühen muss -> (re)validate() (=neuberechnen) aufrufen
das ruft auch repaint() auf

Wenn du nur "zeichentechnisch" was änderst, ohne das Layout zu verändern, dann repaint() (=neuzeichnen)

edit: zu spät :(
 
G

Gast

Gast
Hallo,

danke für die Antworten. Wenn ich validate aufrufe und keine Komponente hinzugefügt/entfernt habe, dann entfällt auch das "repaint", oder? D.h. repaint erfolgt auch nur, wenn wirklich Komponenten hinzugefügt wurden, also Änderungen am Layoutmanager stattfanden...???
 
G

Gast

Gast
Hmm,

ok. wieso reicht es dann aber nicht, wenn ich z.B. einem JPanel per "add" eine Komponente hinzugefügt habe nur "repaint" aufzurufen (zur Laufzeit)? DIe Komponenten werden erst sichtbar, wenn ich validate aufgerufen habe.
 
G

Gast

Gast
Nachtrag...

Ich entferne in einer Schleife mittels "remove" Komponenten aus einem JPanel. Wenn ich nach der Schleife, d.h. nach dem Entfernen der Komponenten, ein "repaint" aufrufe, sieht die GUI "richtig" aus. Wenn ich jedoch nur ein "validate" aufrufe, bleibt eine entfernte Komponente noch sichtbar. Das ist etwas komisch
 

André Uhres

Top Contributor
Gast hat gesagt.:
Ich entferne in einer Schleife mittels "remove" Komponenten aus einem JPanel. Wenn ich nach der Schleife, d.h. nach dem Entfernen der Komponenten, ein "repaint" aufrufe, sieht die GUI "richtig" aus. Wenn ich jedoch nur ein "validate" aufrufe, bleibt eine entfernte Komponente noch sichtbar.
Es funktioniert auch mit :

panel.revalidate();
panel.repaint();

Das wäre effizienter weil nur der parent Container neu validiert und gemalt wird.

Wenn wir es auf JFrame Ebene machen, dann wird unnötige Arbeit erledigt.
 

L-ectron-X

Gesperrter Benutzer
Gast hat gesagt.:
ok. wieso reicht es dann aber nicht, wenn ich z.B. einem JPanel per "add" eine Komponente hinzugefügt habe nur "repaint" aufzurufen (zur Laufzeit)? DIe Komponenten werden erst sichtbar, wenn ich validate aufgerufen habe.
Der LayoutManager wird vor dem Neuzeichnen noch beauftragt, die Komponenten und die Platzverhältnisse neu zu berechnen, ehe gezeichnet wird.
 

André Uhres

Top Contributor
Was L-ectron-X gesagt hat, ist auch der Grund, weshalb bei remove ein revalidate oft nicht genügt.
Im Endeffekt wird nämlich nicht validiert und gemalt, da sich für das Layout nichts Relevantes geändert hat.
 
G

Gast

Gast
Hmm, aber warum das in der Schleife nicht klappt hab ich noch immer nicht ganz verstanden :)
 

André Uhres

Top Contributor
Nehmen wir als Beispiel ein JPanel mit zwei JLabels und FlowLayout(CENTER).

Wenn wir jetzt das JLabel rechts entfernen, dann muss der Layoutmanager das andere neu zentrieren,
also müssen wir panel.revalidate() aufrufen, damit er das tut. Weil die Komponenten aber nicht neu geordnet
werden müssen, sieht das System (leider) keine direkte Notwendigkeit, repaint() aufzurufen.
Darum müssen wir auch noch panel.repaint() aufrufen.

Wenn ich jetzt das JLabel links entferne, dann muss der Layoutmanager das andere ebenfalls
neu zentrieren, also müssen wir ebenfalls panel.revalidate() aufrufen. Weil die Komponenten
jetzt neu geordnet werden müssen (ein JLabel rückt eine Stelle nach links) ruft das System
automatisch repaint() auf. Darum brauchen wir in diesem Fall panel.repaint() nicht aufzurufen.

Bei FlowLayout(LEFT) würde im ersten Fall sogar ein panel.repaint() genügen, weil das
andere JLabel schon an der richtigen Stelle steht.

Es hängt also viel vom verwendeten Layoutmanager ab und auch von der relativen Position
der gelöschten Komponente(n).

Um allen Problemen aus dem Weg zu gehen, empfehlen wir bei remove
sowohl panel.revalidate() als auch panel.repaint() aufzurufen.

EDIT: Das ist jetzt aber etwas vereinfacht ausgedrückt. Wenn neu zentriert wird, wird vom System
im ersten Fall natürlich auch repaint aufgerufen, aber nur für den Bereich bis zur gelöschten
Komponente: also nicht panel.repaint() sonder ein repaint(..) mit den Argumenten, die
das zu malende Rechteck definieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
S Swing Bild in JPanel in ScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 2
H String auf Knopfdruck in JPanel zeichnen. AWT, Swing, JavaFX & SWT 6
L Freies zeichnen auf JPanel AWT, Swing, JavaFX & SWT 3
das-mo AWT In JPanel 2mal zeichnen AWT, Swing, JavaFX & SWT 3
R JPanel auf JFrame neu zeichnen AWT, Swing, JavaFX & SWT 11
P RAM-Auslastung - Problem. Zeichnen von JPEGs auf JPanel AWT, Swing, JavaFX & SWT 2
A Swing Zeichnen auf JPanel AWT, Swing, JavaFX & SWT 4
B Zeichnen von Bildern auf JPanel aus eigenem Objekt AWT, Swing, JavaFX & SWT 19
B Swing JPanel in Abhängigkeit von DefaultListModel Instanz neu zeichnen AWT, Swing, JavaFX & SWT 3
S auf einem mit Netbeans (GUI) erstellten JPanel (eines JFrames) zeichnen? AWT, Swing, JavaFX & SWT 7
Sammay Swing JPanel nach dem einfügen neu zeichnen AWT, Swing, JavaFX & SWT 6
N JPanel zeichnen AWT, Swing, JavaFX & SWT 4
V Bild auf JPanel zeichnen AWT, Swing, JavaFX & SWT 9
G Swing Kreise auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
V Zeichnen auf JPanel und in JFrame einfügen AWT, Swing, JavaFX & SWT 16
D In JPanel zeichnen AWT, Swing, JavaFX & SWT 11
E Rechteck in JPanel Zeichnen AWT, Swing, JavaFX & SWT 6
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
0din Jpanel will nich alles zeichnen AWT, Swing, JavaFX & SWT 15
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
R JPanel - zeichnen in skalierten Bereich - Linie (X-Achse) nicht sichtbar AWT, Swing, JavaFX & SWT 11
B Zeichnen in jPanel AWT, Swing, JavaFX & SWT 2
R JPanel - Markierung an der Mausposition zeichnen AWT, Swing, JavaFX & SWT 4
R JPanel in JScrollPane - zeichnen der Mausposition AWT, Swing, JavaFX & SWT 3
R JPanel in JScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 7
R JPanel - zeichnen eines Arrays AWT, Swing, JavaFX & SWT 18
W Zeichnen verschiedener geom. Figuren in einem JPanel AWT, Swing, JavaFX & SWT 5
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
F JPanel übereinander zeichnen AWT, Swing, JavaFX & SWT 4
S Zeichnen in einem JPanel AWT, Swing, JavaFX & SWT 15
N Formen drehen und auf JPanel zeichnen AWT, Swing, JavaFX & SWT 6
B JPanel + Zeichnen AWT, Swing, JavaFX & SWT 3
S Problem mit dem Zeichnen einer Linie auf einem JPanel AWT, Swing, JavaFX & SWT 30
M Auf JPanel zeichnen AWT, Swing, JavaFX & SWT 17
H Punkte auf einem JPanel zeichnen AWT, Swing, JavaFX & SWT 4
G Auf JPanel zeichnen? AWT, Swing, JavaFX & SWT 2
P JPanel Inhalt neu zeichnen AWT, Swing, JavaFX & SWT 5
feuervogel in Jpanel zeichnen AWT, Swing, JavaFX & SWT 3
M JPanel ausserhalb von paintComponent zeichnen AWT, Swing, JavaFX & SWT 6
L Komponente und Grafik gleichzeitig auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen


Oben