2012-08-13 11 views
5

Ich baue eine Desktop-App mit Swing mit ähnlicher Funktionalität wie Twitter. Ich habe eine "Feed" -Seite, auf der "Tweets" angezeigt werden.Layout mit Swing dynamisch neu anordnen

Ich habe die "Tweets" in einem JPanel und möchte dynamisch neue anzeigen, die hereinkommen, indem ich neue "Tweets" oben auf dem JPanel platziere und ältere "Tweets" nach unten verschiebe. Ich habe versucht, dies mit MigLayout mit jpanel.add(tweet, "cell 0 0, wrap") zu tun, aber das hat nicht wie geplant funktioniert und um es mit dem gewünschten Layout anzuzeigen, musste ich jpanel.revalidate() aufrufen.

Dies ist nicht ideal, da es in jeder Sekunde viele Tweets geben kann und das Neuzeichnen des Panels ziemlich langsam sein kann. Kann ich da noch neue "Tweets" am oberen Rand des Panels hinzufügen, ohne sie neu zu zeichnen?

+1

Sie können diese beiden Antworten kombinieren, um ein 'TableModel' zu aktualisieren, wie in der' SwingWorker'-API gezeigt. – trashgod

Antwort

10

Obwohl dynamische Layouts sind möglich, wie here und here gezeigt, würde ich eine einspaltige JTable mit einem TableModel verwenden, die den Stapel Effekt Pushdown- reflektieren Sie wollen, vielleicht einen ein internes Queue<Tweet> hat. JTable Rendering ist effizient, und die Komponente funktioniert gut in einem JScrollPane.

10

Kurze Antwort, nein. Ernsthaft, nimm dir einen Moment Zeit, um über die Frage nachzudenken. "Ich möchte neue Inhalte hinzufügen, aber den Bildschirm nicht aktualisieren", wie denkst du, dass das so ist?

Sie werden irgendwann eine Art von Malerei durchführen müssen. Die Frage ist wie oft.

jedoch ...

Mit einigen einfachen Techniken (und Modellierung) Sie können „verschmelzen“ die Updates in den Reihen, so dass der Neuzeichnungsindex mehr sinnvoll sein (eher dann jeden neuen tweet malen, malen Sie einen Stapel) .

Sie könnten etwas wie eine SwingWorker verwenden, um dies zu tun. Grundsätzlich publish der Tweet und erlauben Sie die process Methode, mit dem Hinzufügen der Stücke danach zu beschäftigen.