الرسوم المتحركة GIF في خلية الجدول SWT / شجرة عارض شجرة

StackOverflow https://stackoverflow.com/questions/2037353

  •  19-09-2019
  •  | 
  •  

سؤال

http://www.java2s.com/code/java/swt-jface-eclipse/displayananimatedgif.htm. يصف كيفية عرض GIF متحرك في SWT - بشكل عام. في حين أن الرمز يعمل وسهولة فهم مشكلات خطيرة تعرض GIF متحرك في خلية عارض SWT / JFACE مع هذه التقنية. -> كل الكود أدناه

في الأساس، قمت بتنفيذ المالك الخاص بالملكية الخاصة بي التي تنشئ ImageLoader في الطلاء (الحدث أو كائن) وبدء موضوع الرسوم المتحركة. يبدو أن المشكلة هي أن هذا الموضوع الرسوم المتحركة هو ليس موضوع UI ولا أعرف أي مثيل GC أو عرضه لاستخدامه في طريقة التشغيل ().

حاولت إنشاء مثيل GC منفصل في منشئ الخيط - مشتقة من الأحداث .GC - لكن الخيط يفشل في الكتابة إلى ذلك بموجب GC بمجرد الخروج من المصحح ...

SAT 9 Jan 9 22:11:57 192.168.1.6.local.home.home Java [25387]: CGCONTEXTCONCATCTM: سياق غير صالح 0x0 2010-01-09 22: 12.356 جافا [25387: 17B03] لا معنى له رسم صورة عندما [nsgraphicscontext currentcontext] هو nil. هذا خطأ برمجة. كسر _nswarnfordrawingimagewithnocurrentcontext لتصحيح الأخطاء. سيتم تسجيل هذا مرة واحدة فقط. هذا قد يكسر في المستقبل. السبت 9 يناير 22:12:41 192.168.1.6.local.home.home Java [25387]: CGCONTEXTCONCATCTM: سياق غير صالح 0x0

كيف أحتاج إلى التعامل مع هذا الموقف؟
فيما يلي أقسام التعليمات البرمجية ذات الصلة:

/ * دعا حسب الطلاء (الحدث، كائن). * / الفراغ الخاص مراداه (حدث الحدث النهائي، Imageloader النهائي Imageloader) {IF (ImageLoader == Null || arrayutils.isementy (imageloader.data)) {العودة؛ } الخيط النهائي Animatethread = New AnimationThread (الحدث، ImageLoader)؛ animatethread.setdaemon (صحيح)؛ animatethread.start ()؛ } فئة خاصة AnimationThread تمتد الموضوع {عرض العرض الخاص؛ خاص GC GC؛ Imageloader الخاص Imageloader؛ خلفية اللون الخاص animationthread العام (حدث الحدث النهائي، Imageloader النهائي Imageload) {Super ("الرسوم المتحركة")؛ this.display = event.display؛ / * * إذا كنا نحصل ببساطة، فسيتم إعادة ضبط / إفراغ في الوقت الذي يتم استخدامه * قيد التشغيل (). * / this.gc = gc جديد (event.gc.getDevice ())؛ this.imageloader = Imageloader؛ this.background = getbackgrounground (event.item، event.index)؛ } Roverride Public Run () {/ * * إنشاء صورة خارج الشاشة لرسمها، وملءها مع خلفية Shell. * / الصورة النهائية Offscreenimage = صورة جديدة (this.display، this.imageloader.logicalscreenwidth، this.imageloader.logicalscreenheight)؛ Final GC OffscreenimageGC = GC جديد (Offscreenimage)؛ offscreenimagegc.setbackground (this.background)؛ offscreenimagegc.fillrectolectivity (0، 0، this.imageloader.logicalscreenwidth، this.imageloader.logicalscreenheight)؛ صورة الصورة = NULL؛ جرب {/ * إنشاء الصورة الأولى واسحبها في صورة خارج الشاشة. * / int imagedataindex = 0؛ imagedata imagedata = this.imageloader.data [imagedataindex]؛ الصورة = صورة جديدة (this.display، imagedata)؛ offscreenimagegc.drawimage (صورة، 0، 0، imagedata.width، imagedata.height، imagedata.x، imagedata.y، imagedata.width، imagedata.height)؛ / * * الآن حلقة من خلال الصور، وإنشاء ورسم كل واحد على صورة خارج الشاشة قبل * رسمها على قذيفة. * / int treatcount = this.imageloader.repeatcount؛ بينما (this.imageloader.repeatcount == 0 || التكرار> 0) {switch (imagedata.disposalmethod) {case swt.dm_fill_background: / * املأ لون الخلفية قبل الرسم. * / Offscreenimagegc.setbackground (this.backgrounger)؛ offscreenimagegc.fillrectolectivity (imagedata.x، imagedata.y، imagedata.width، imagedata.height)؛ استراحة؛ Case Swt.dm_fill_previous: // استعادة الصورة السابقة قبل الرسم. offscreenimagegc.drawimage (صورة، 0، 0، imagedata.width، imagedata.height، imagedata.x، imagedata.y، imagedata.width، imagedata.height)؛ استراحة؛ } imagedATATEX = (imagedataindex + 1)٪ this.imageloader.data.length؛ imagedata = this.imageloader.data [imagedataindex]؛ image.dispose ()؛ الصورة = صورة جديدة (this.display، imagedata)؛ offscreenimagegc.drawimage (صورة، 0، 0، imagedata.width، imagedata.height، imagedata.x، imagedata.y، imagedata.width، imagedata.height)؛ / / ارسم صورة خارج الشاشة. this.gc.drawimage (Offscreenimage، 0، 0)؛ / * * ينام لوقت التأخير المحدد (إضافة عوامل الاصوات البطيئة المستخدمة بشكل شائع). * / جرب {Int MS = Imagedata.delaytime * 10؛ إذا (السيدة 

لقد نشرت نفس المشكلة إلى مجموعة أخبار SWT http://www.eclipse.org/forums/index.php؟t=tree&th=160398.

هل كانت مفيدة؟

المحلول

بعد ساعات عديدة من المحاكمة الإحباطية والخطأ، ظهر عامل مشارك حلا ممكنا. فشلت نهجتي الأولية التي تم تنفيذه في أسلوب LableProvider ذاتيا بالكامل.

كان نهج واحد لم ينجح في تجاوز تحديث LabelProvider # التحديث () واستدعاء Timerexec (100، Rennable New Runnable () {... Viewer.update () ... من داخل هذه الطريقة. "الحياة" -لة من الصعب التحكم فيه ويستخدم الكثير من دورات وحدة المعالجة المركزية (10٪ على Macbook).

كان أحد أفكار الزميل هو تنفيذ مائدة مخصصة: تسمية مع صورة (إطار واحد من GIF المتحركة) ولكن لا يوجد نص. سيبدأ كل مثيل طاولة على كل مؤشر ترابط خاص به يقوم بتحديث صورة الملصقات. هذا يعمل بشكل جيد للغاية، ولكن هناك موضوع منفصل "الرسوم المتحركة" لكل أيقونة متحركة. أيضا، كان هذا قاتل الأداء، حيث استهلكت 25٪ وحدة المعالجة المركزية في MacBook.

النهج النهائي لديه ثلاث لبنات بناء

  • مالكيالابيلبروفيريد الذي يرسم إما صورة ثابتة أو إطار GIF المتحركة
  • مؤشر ترابط الرسوم المتحركة (صانع السرعة)، يقوم بإعادة رسم إعادة رسم () للعمود الذي يحتوي على صور متحركة ومكالمات التحديث ()
  • ومزود محتوى المشاهد الذي يتحكم في مؤشر ترابط الرسوم المتحركة.

التفاصيل في مدونتي http://www.frightanic.com/02/09/02/09/Animated-gif-in-swt-tabletree-viewer-cell/.

نصائح أخرى

لا يمكنك السماح لعلامة LabelProvider بإرجاع صور مختلفة ثم استدعاء Viewer.update (...) على العناصر التي تريد تحريكها. يمكنك استخدام Display.timerexec للحصول على رد اتصال بدلا من وجود مؤشر ترابط منفصل.

انظر إجابتي هنا لكيفية تغيير الألوان. يجب أن تكون قادرا على القيام بشيء مماثل مع الصور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top