Ich habe ein einfaches Objekt, das JPanel
erweitert. Wenn die Methode update()
für dieses Objekt aufgerufen wird, sollten einige Beschriftungen zum Panel hinzugefügt und dann neu gezeichnet werden. Die Labels werden jedoch nicht angezeigt, nachdem die Update-Methode aufgerufen wurde. Im Folgenden finden Sie den Code für die Aktualisierung:
irgendwelche Ideen?
Danke
BEARBEITEN
gelöst:
Es stellt sich heraus, dass das HoleCardsPanel
nicht korrekt zu seinem Eltern-Frame hinzugefügt wurde. Sobald das behoben wurde, funktioniert das Hinzufügen von neuem JLabel
s gut. Ich auch:
update()
dem Ereignis-Versand-Thread hinzugefügt, indem er SwingUtillities.invokeLater
verwendet
validate()
von der obersten Komponente (in diesem Fall JFrame
) aufrufen, wie Devon_C_Miller in seiner Antwort vorschlägt . Es hängt davon ab, was Sie wollen und welche Layout-Manager verwendet werden, aber die Grundregeln sind:
Stellen Sie sicher, dass update
im EDT aufgerufen wird. Wenn dies nicht der Fall ist ( SwingUtilities.isEventDispatchThread()
gibt false zurück), müssen Sie SwingUtilities.invokeLater
verwenden, um die Aktualisierung auf dem EDT zu planen. Zum Beispiel:
Rufen Sie invalidate()
auf. Die meisten Dinge, die eine Komponente ändern, tun dies für Sie. Sie müssen das also nur aufrufen, wenn das folgende nicht alleine funktioniert.
Rufen Sie validate()
für die höchste betroffene Komponente auf. Dies ist wahrscheinlich das matschigste Teil von Javas Rendering-Zyklus. Der Aufruf von invalidate
markiert die Komponente und alle ihre Vorfahren als benötigtes Layout. Der Aufruf von validate
führt das Layout der Komponente und aller ihrer Nachkommen aus. Man arbeitet "up" und das andere arbeitet "down". Sie müssen validate
für die höchste Komponente in der Baumstruktur aufrufen, die von Ihrer Änderung betroffen sein wird.
Auch das Aufrufen von validate auf einer Top-Level-Komponente (JWindow, JDialog, JFrame) wird nicht notwendigerweise die Größe dieser Komponente ändern. Um dies zu ermöglichen, müssen Sie pack()
oder setSize()
aufrufen.
Wenn Ihre Änderungen die Größe oder Position von Containern ändern, werden die skalierten Container neu gezeichnet, aber sie löschen nicht den Speicherplatz, den belegt hat. Durch den Aufruf von repaint()
für den übergeordneten Container wird der Hintergrund neu gezeichnet und der Schaden korrigiert.
Versuchen Sie, revalidate () aufzurufen; Repaint ist nicht was du willst.
Gemäß:
API-Dokumente
Hinweis: Wenn eine Komponente hinzugefügt wurde ein Container, der angezeigt wurde, validate muss dazu aufgerufen werden Container, um den neuen anzuzeigen Komponente. Wenn mehrere Komponenten sind hinzugefügt werden, können Sie verbessern Effizienz durch Aufruf nur validieren einmal, nachdem alle Komponenten haben hinzugefügt worden.
revalidate () ist im Grunde ein invalidate () gefolgt von validate ().
Siehe diese Frage .....
> Der Aufruf an validate()
sollte arbeiten, obwohl revalidate()
ausreichend sein kann; repaint()
sollte nicht benötigt werden. Sie können das, was Sie tun, mit diesem Beispiel vergleichen, das dynamisches GridBagLayout
ausführt.
Haben Sie SetVisible () auf den Etiketten versucht?
Haben Sie versucht, die Objekte bei der Initialisierung ohne Update hinzuzufügen? Wenn sie dort nicht auftauchen, werden sie niemals auftauchen.
Es stellt sich heraus, dass das HoleCardsPanel
nicht korrekt zu seinem Eltern-Frame hinzugefügt wurde, sobald das behoben wurde, funktioniert das Hinzufügen von neuem JLabels
gut. Ich habe den Aufruf der update()
-Methode zum event dispatch thread
hinzugefügt, indem ich SwingUtillities.invokeLater
I zusätzlich validate()
von der obersten Komponente (in diesem Fall JFrame
) aufgerufen habe
Tags und Links java user-interface swing repaint