2013-08-09 17 views
6

İdeal olarak, cevap platform bağımsız olacak, ama platforma özel, özellikle Oracle JVMs yanı yararlıdır. Üzerinde çalıştığım proje hala 6 JVM versiyonunda çalışıyor.AWT/Swing olay sıra uzunluğu programlı olarak nasıl raporlanır?

Özel gereksinim, zaman zaman "donma" olan bir GUI ile ilgilidir. EDT'de GUI çalışması yapmanın çok iyi farkındayım. Program Windows üzerinde iyi çalışıyordu, ancak Linux'a geçtikten sonra bu "garip" GUI sorunları yaşanmaya başladı. Aslında, bu sorun hem Windows'dan Linux'a geçtikten sonra iki uygulamada gerçekleşti. JVisualVM, 10 milyondan fazla java.awt.EventQueueItem nesnesini gösterir. şüphe AWT kuyruğu daha hızlı Linux üzerinde sunulmakta olduğundan çok daha fazla büyüdüğünü, bu nedenle fikir, uygulamada bir AWT sırası uzunluğu göstergesini koymak ve kuyruk büyüdükçe küçülür/görünenden görmektir.

Biraz Googling bulundu this, ancak sırayla bir doğrusal tarama yapar. Belki daha iyi bir yolu var mı?

+1

Keşfetmek için, olayları aşağıda gösterildiği gibi engelleyebilirsiniz (http://stackoverflow.com/q/3158254/230513). – trashgod

+0

Ten _million_! 'SetCoalesce (yanlış) '? – trashgod

+0

Hayır. Bunu zaten düşündüm ve bunun için tarandı. Birleştirme mantığını kapatmamak. –

cevap

3

İlginç bir konu. Ben EventQueue kodunu biraz araştırdık ve ben problemleriniz varken, ben bazı yararlı işaretçiler olabilir:

  1. sen devralmak sürece, bir boyut değişkeni tutmaz EventQueue Oracle'ın uygulama EventQueue öğesinin tam denetimi (bkz. 3), Oracle'ın JRE'sini kullanırken sıraya ait doğrusal bir taramadan daha iyi bir şekilde yapacağınız bir yol yoktur.
  2. Kendi EventQueue'unuzu (muhtemelen Oracle'ın uygulamalarını kopyalayıp yapıştırarak ** en kolayı olacak) yazabilir ve kendi uygulamanızı kurmak için EventQueue.push(EventQueue)'u kullanabilirsiniz. Kuyruktaki tüm olaylar sıranıza aktarılır, böylece onları sıranıza gönderildiği gibi sayabilirsiniz. Ne yazık ki, bu hala doğrusal bir tarama, ama en azından şimdi platformdan bağımsız.
  3. Alternatif olarak, özgün olay sırası oluşturulduktan sonra mümkün olan en kısa sürede kendi EventQueue uygulamanızı yükleyebilirsiniz (bkz. 2) (bunu, ana yönteminizi içeren sınıfın başında bulunan statik kod bloğunda yapın). Ardından, uygulamanız tüm etkinlikleri yayınlandıkça sayar ve boyutu bilmek istediğinizde kuyruğu taramanız gerekmez. (Herkes bu denemedim, ama tüm kamu/korumalı statik kod şerit olacaktır:

** Bazı ince ayar); sadece hiç kimse senin üzerine kendi EventQueue iter umut gerekecek Bu yöntemleri/değişkenleri başvurur java.awt.EventQueue neyse, ve böylece yapabilirsiniz), boyut değişkeni ekleyin ve aşağıdaki dört yöntemde bu değişkeni güncelleyin: postEvent(AWTEvent, int), getNextEventPrivate(), getNextEvent(int) ve removeSourceEvent(Object, boolean).

bu değişiklik ile büyük sorun EventQueue Eğer uygulama farklı bir pakette olacağından aramaya izin verilmez, hangi (örneğin, Toolkit.getEventQueue() ve Component.getAccessControlContext() için) varsayılan görünürlük ile AWT yöntemlerine bazı aramalar yapar gerçektir . Her bir durum için ayrı ayrı bir geçici çözüm bulmanız gerekir.

+0

"copy-pasteing" nedir?, O 'EventQueu' genişletebilir ve sonra kendi uygulamasına 'itme' olabilir .. – nachokk

+0

Sorun, özel yöntemleri değiştirmek, yani onları yeniden uygulamak anlamına gelir. Java.awt.EventQueue öğesinin tüm kodları kendi "kendi" özel yöntemlerini çağırdığından, bu yöntemleri de yeniden uygulamanız gerekir. Bu yeniden uygulama zinciri, yalnızca halka veya korumalı yöntemlere ulaştığınızda durur. Ayrıca, eğer zincir java'da başka bir yerden çağrılan varsayılan görünebilirlik içeren yöntemler içeriyorsa.awt, tüm davetleri kendi uygulamalarınıza özel yöntemlere yönlendirmek imkansız hale gelir. Tüm pratik amaçlar için, kopyala yapıştırmanın daha iyi olduğunu düşünüyorum. –

İlgili konular