PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Swing: Buttons werden nicht richtig angezeigt


Gast
2008-06-09, 23:11:20
Hi,

Ich habe folgendes Problem:
Ich rufe in einer ActionListener Ereignisbehandlung folgenden Code auf:

panel.removeAll();
ArrayList<Typ> list = model.getItems();
for (Typ x : list) {
JButton b = new JButton("bla");
panel.add(b);
}

Das Problem ist nur, dass die dort neu hinzugefügten Buttons nicht sofort richtig angezeigt werden, sondern erst, wenn ich z.B. das Fenster resize.
Was kann ich da machen?
Hab auch schon versucht repaint() aufzurufen, aber das klappt auch nicht.

RattuS
2008-06-09, 23:17:49
Ich komme nicht direkt aus der Java-Ecke, aber schau mal hier: http://www.tutego.com/blog/javainsel/2007/07/revalidate-invalidate-validate-repaint.html

Byteschlumpf
2008-06-09, 23:56:30
Hi,

probier's dochmal mit "b.addActionListener(dein ActionListener)"
am Ende der Klasse.

Gast
2008-06-10, 00:06:18
Ich komme nicht direkt aus der Java-Ecke, aber schau mal hier: http://www.tutego.com/blog/javainsel/2007/07/revalidate-invalidate-validate-repaint.html
Also ich habs mit invalidate jetzt mal ausprobiert, und das klappt auf jedenfall schonmal besser als vorher, aber manchmal sind da trotzdem Grafikfehler Oo

Hi,

probier's dochmal mit "b.addActionListener(dein ActionListener)"
am Ende der Klasse.
Klappt auch nicht.

instinct
2008-06-10, 07:58:11
Dein Toplevel Window muss nach der Aktion ein pack() machen, hatte das Problem auch mal und so konnt ich es bei mir lösen.

Gast
2008-06-10, 08:58:52
Aktionen, die Swing-Code enthalten, sollten im event dispatch thread (EDT) laufen.
Probier's mal mit SwingUtilities.invokeLater()
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

Gast

Monger
2008-06-10, 09:23:03
Aktionen, die Swing-Code enthalten, sollten im event dispatch thread (EDT) laufen.
Probier's mal mit SwingUtilities.invokeLater()
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

Gast
Grundsätzlich gesehen hast du schon Recht, aber der TS erzeugt ja überhaupt keine Swing Ereignisse in seinem Code. Er baut nur die Oberfläche auf - und der Code läuft eben nicht über den Event Dispatcher.

@topic:
Um erstmal zu wissen welche Elemente denn alles auf der Oberfläche gibt, braucht es ein pack(). Änderungen an diesen Elementen (Größe, Farbe, Position etc.) können über ein Invalidate (was implizit dann die Bereiche repainted die nötig sind) erzwungen werden.

Mit beidem sollte man sehr wohldosiert umgehen. Vorallem das pack() ist ziemlich resourcenintensiv. In aller Regel weiß das Swing Framework selbst am besten wann ein Repaint angebracht ist und wann nicht - wahllos dazwischen zum Repaint zu zwingen, kann erst recht zu Darstellungsfehlern führen.

Gast
2008-06-10, 15:03:59
Grundsätzlich gesehen hast du schon Recht, aber der TS erzeugt ja überhaupt keine Swing Ereignisse in seinem Code. Er baut nur die Oberfläche auf - und der Code läuft eben nicht über den Event Dispatcher.



Auch der Aufbau der GUI sollte im EDT passieren, wie auch Sun es vormacht:
http://java.sun.com/docs/books/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start//HelloWorldSwing.java

Monger
2008-06-10, 15:18:31
Auch der Aufbau der GUI sollte im EDT passieren, wie auch Sun es vormacht:
http://java.sun.com/docs/books/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start//HelloWorldSwing.java

*Hust*, okay hast Recht! Natürlich, man startet den Konstruktor ja üblicherweise mit dem "InvokeLater".
Ich nehme alles zurück, und behaupte das Gegenteil! :D

Gast
2008-06-10, 18:07:15
*Hust*, okay hast Recht! Natürlich, man startet den Konstruktor ja üblicherweise mit dem "InvokeLater".
Ich nehme alles zurück, und behaupte das Gegenteil! :D
Aber die Eventhandler laufen doch trotzdem im Swing Thread, und brauchen von daher doch kein invokeLater, oder?

Monger
2008-06-10, 19:06:45
Aber die Eventhandler laufen doch trotzdem im Swing Thread, und brauchen von daher doch kein invokeLater, oder?
Ja, die Event Handler werden ja ausschließlich durch Events angesprochen die von Swing/AWT Controls herstammen - die sorgen dann selber schon dafür, dass diese Events auch wirklich auf der AWTEventQueue ablaufen.

Ist im übrigen in .NET mit den Windows Controls sehr ähnlich.