Die Inhalte meiner JComponent nur regenerieren, nach einer manuellen Größenänderung
Ich versuche herauszufinden, warum meine JComponent aktualisiert, wenn ich manuell ziehen, mein Fenster, aber es spielt nicht aktualisieren, wenn ich rufe repaint oder revalidate. Die Daten werden angezeigt, aber es will einfach nicht zeigen, bis ich manuell in der Größe verändern. Kann jemand ein paar Anregungen geben, was ich tun kann, oder dieses klingt wie es ist nicht ein Swing-problem, seit ich versucht repaint und revalidate?
Einer seltsamen Dinge, die ich bemerkt habe ist, dass wenn ich in diesem code:
sp.setSize(sp.getSize().width, sp.getSize().height+1);
sp.setSize(sp.getSize().width, sp.getSize().height-1);
Wenn die erste Zeile verwendet wird, dann die JComponent wird selbst aktualisieren. Wenn ich keine oder beide dieser Linien wird es nicht, das scheint Bizarr zu mir.
Ich bin im Grunde genommen nur darum, ein JPanel im JInternalFrame in ein JDesktopPane. Es gibt zwei Hauptfunktionen für das, was ich versuche zu tun. Fügt man das neue JPanel und der andere versucht, um es zu aktualisieren, damit die neuen Daten zeigen:
public void addNewSP()
{
sp = new JInternalFrame("SP");
sp.setClosable(true);
sp.setLocation(700, 400); //this should be changed to something based on screen size
sp.setResizable(true);
sp.add(popUp);
this.parentContainer.add(sp, JLayeredPane.DRAG_LAYER);
sp.pack();
sp.show();
sp.setSize(500, 500);
sp.setPreferredSize(new Dimension(500, 500));
}
public void refreshSP()
{
sp.repaint();
sp.validate();
sp.repaint();
sp.validate();
parentContainer.validate();
parentContainer.repaint();
sp.setSize(sp.getSize().width, sp.getSize().height+1);
sp.setSize(sp.getSize().width, sp.getSize().height-1);
}
}
BTW parentContainer ist die JDesktopPane
- Sie liefert nicht genug Informationen, um alles besser als wilde Vermutungen. Poste bitte ein SSCCE (sscce.org).
- Leider glaube ich nicht, das würde zu viel gutes in diesem Fall. Ich habe eine harte Zeit, die Isolierung dieses problem. Ich bin wahrscheinlich zu haben, um zu inspizieren, meinen code und versuchen, mehr Dinge, damit ich darstellen kann, eine bessere Frage. Ich wünschte nur, ich wusste, was das manuelle anpassen der Größe war die Berufung in Schwung. Ich denke, dass ich die richtige Anrufe mit validate und repaint, aber nicht in der richtigen Reihenfolge, oder vor Ort 🙁
- Gut, wissen, dass wir wissen, Sie reden über den internen Rahmen der Beratung anders sein würde. Das ist, warum Sie sollten immer nach einem SSCCE, so dass wir die Zeit nicht vergeuden, zu erraten, was Sie reden. Haben, Lesen Sie bitte den Abschnitt aus dem Swing-tutorial "Wie man die Nutzung von Internen Frames". Das Beispiel zeigt, wie man dynamisch erstellen und hinzufügen von internen frames zu einer desktop-Bereich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim ändern des container-Inhalts, Sie zu rufen beide:
revalidate()
um es neu berechnen, das layout für Ihre Inhalterepaint()
um eine Anfrage für ein repaint für diese containerrevalidate()
auf, arbeitete auf dem container, ich war das hinzufügen und entfernen aus dem container mit diesem container. Brauchte nicht zu rufenrepaint()
obwohl.Kennen wir nicht den Kontext deiner Frage, die ist, warum ein SSCCE sollten immer gepostet werden wie früher vorgeschlagen.
Im Allgemeinen eine JComponent, nicht eine bevorzugte Größe, so dass ich vermute, dass Swing nicht denken, es muss die Farbe der Komponente. Wenn Sie die Größe des Rahmens ändern, sind die Chancen auf die Komponente Hinzugefügt wurde, um die Mitte ein BorderLayout, so dass es automatisch wird dimensioniert, um den gesamten Raum ausfüllen des Rahmens.
Die Lösung Ihrer Komponente eine "bevorzugte Größe", so dass jede layout-manager können diese Informationen verwenden, um die Komponente anzuzeigen, richtig.
wenn Ihr das ändern des Containers Unterkomponenten sollten Sie rufen jcomponent.validate();
validate
stattrevalidate
? Könnte funktionieren...Ich gehe davon aus
parentContainer
ist die JDesktopPane?Welche Art von änderungen Sie machen, um
sp
werden nicht angezeigt?Ändern der Größe von
sp
verursachen Swing-repaint von Grund auf. Das ist, warum diesetSize()
ist die Befestigung der Anzeige.Wahrscheinlich, die änderungen, die Sie machen, sind entweder nicht passiert, auf der EDT, nicht oder ungültig zu machen die richtigen Behälter. Zum Beispiel, wenn Sie ändern der Sichtbarkeit einer Komponente in
sp
haben, müssen Sie rufensp.invalidate()
erneut die layout-manager.Haben Sie überprüft, dass Sie nur ändern von Komponenten (bzw. deren Modelle) auf den EDT?
Einen schnellen test für das laufen mit der Substanz LAF wie wird sich beschweren, wenn Sie die Dinge ändern in einem anderen thread.