Swing JPanel wird nicht neu gezeichnet

8

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:

%Vor%

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:

  • hat den Aufruf der Methode update() dem Ereignis-Versand-Thread hinzugefügt, indem er SwingUtillities.invokeLater verwendet
  • musste validate() von der obersten Komponente (in diesem Fall JFrame ) aufrufen, wie Devon_C_Miller in seiner Antwort vorschlägt .
Aly 28.01.2010, 14:56
quelle

6 Antworten

20

Es hängt davon ab, was Sie wollen und welche Layout-Manager verwendet werden, aber die Grundregeln sind:

  1. 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:

    %Vor%
  2. 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.

  3. 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.

  4. 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.

Devon_C_Miller 28.01.2010 20:36
quelle
12

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 .....

>     
Chris Kannon 28.01.2010 15:11
quelle
5

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.

    
trashgod 28.01.2010 19:18
quelle
2

Sie könnten versuchen, updateUI() method aufzurufen.

    
Carlos Blanco 28.01.2010 19:50
quelle
0

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.

    
Philippe Carriere 28.01.2010 15:05
quelle
0

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

    
Aly 29.01.2010 12:39
quelle

Tags und Links