2012-08-13 14 views
5

Buduję aplikację na komputery z Swingiem o podobnej funkcjonalności do Twittera. Mam stronę "kanału", na której wyświetlane są "tweety".Dynamicznie zmieniaj układ za pomocą Swinga

Mam "tweety" w JPanelu i chcę dynamicznie wyświetlać nowe wchodząc poprzez umieszczanie nowych "tweetów" na górze JPanelu i przenoszenie starszych. Próbowałem to zrobić z MigLayout, używając jpanel.add(tweet, "cell 0 0, wrap"), ale to nie zadziałało zgodnie z zamierzeniami i aby go wyświetlić z układem, który chciałem, musiałem zadzwonić pod numer jpanel.revalidate().

Nie jest to idealne rozwiązanie, ponieważ w każdej sekundzie może pojawić się wiele tweetów, a ponowne rysowanie panelu może być dość powolne. Czy mimo to mogę dodawać nowe "tweety" na górze panelu bez przerysowywania?

+1

Możesz połączyć te dwie odpowiedzi, aby zaktualizować 'TableModel', jak pokazano w API' SwingWorker'. – trashgod

Odpowiedz

10

Chociaż dynamiczne układy są możliwe, jak pokazano here i here, chciałbym użyć jedną kolumnę JTable z TableModel odzwierciedlającym stosem stos efekt chcesz, być może jeden posiadający wewnętrzną Queue<Tweet>. Renderowanie JTable jest wydajne, a komponent działa dobrze w wersji JScrollPane.

10

Krótka odpowiedź, nie. Poważnie, poświęć chwilę na przemyślenie tego pytania. "Chcę dodawać nowe treści, ale nie aktualizować ekranu", jak myślisz, jakie to możliwe?

Będziesz musiał kiedyś wykonać jakiś obraz. Pytanie brzmi, jak często.

Jednak ...

Z kilku prostych technik modelowania (i) można „zlewają” aktualizacje na partie, pozwalając repaint być bardziej sensowne (a następnie malowanie każdy nowy tweet, malujesz partię) .

Aby to zrobić, można użyć czegoś takiego, jak SwingWorker. Zasadniczo publish tweet i pozwól, aby metoda process zajmowała się później dodawaniem porcji.