الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Swingutilities.invokelater

بدأه hamzalion في 8 أكتوبر 2008 · 5 رد · 2,625 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ممكن شرح وظيفة هذه الدالة وما أهميتها

 SwingUtilities.invokeLater(Runable)

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 10 نوفمبر 2008 في 03:38 — السبب: تغيير عنوان الموضوع وإضافة وسم code

#2

في البدايه قبل أن تتعرف على وظيفه الداله SwingUtilities.invokeLater() هناك موضوع مرتبط به وهو Event Dispatched Thread . ففي أي برنامج تقوم بعمله وتنشى كائن من AWT (أو Swing فهي تعتمد على الأولى) وتظهر الكائن (سواء بالداله show أو setVisible أو حتى paint ) فسوف يعمل الحدث الخاص به ولكن لن يعمل في Main Thread بل في ثريد خاص يسمى EDT .

أي أن Event Dispatched Thread هو ثريد خاص للتعامل مع الأحداث وعمليات رسم المكونات drawing and event-handling code سواء Swing أو AWT ، مثلا الدوال paint() و actionPerformed() مباشره سوف تعمل في EDT . -دوال اعاده الرسم ، ودوال التعامل مع الحدث تعمل مباشره في هذا الثريد-

ومكونات Swing هي غير أمنه لحظه التعامل مع الThread (هي Not-Thread Safe) بمعنى أنه يجب عند التعامل مع هذه المكونات أن تعمل في Thread واحد ، وأي داله تحاول أن تغير من قيمه الكائن من Swing يجب أن يعمل في نفس Thread . بعكس AWT .

Once a Swing component has been realized, all code that might affect or depend on the state of that component should be executed in the event-dispatching thread

الأن لكي نقوم بتنفيذ كود داخل الـ EDT ، وفرت sun لنا دالتين في الكلاس SwingUtilities هما :

invokeLater وهي تقوم بوضع الكود الذي تريد أن يعمل في EDT في صف العمليات Event Queue، وترجع مباشره بدون أنتظار تنفيذه ،

invokeAndWait نفس عمل الداله السابقه ولكن تتنظر الى أن يتم تنفيذه ،

هناك طريقه أخرى لتنفيذ الكود في EDT عن طريق Swing Worker أظنه خاص باصدارت جافا 5 وما فوق ، لم أجربه للأسف .

بشكل عام هذه الداله invokeLater تستخدم عندما تريد أن تغير في كائنات Swing من Thread أخر ، فكما في الـ tutorials من sun عند أنشاء مكونات Swing من الداله main ، فيتم انشائها بهذه الداله لأن Main يعمل في Thread منفصل عن EDT .. لكن عند التعامل مع الـ Listener لا توجد حاجه لأنني كما ذكرت في البدايه جميع الـ Listener وpainting و revalidate جميع تلك الداول تعمل في EDT مباشره ،

You only need to use invoke later when you change a component from another thread

على العموم ، بالنسبه لى لم أستخدم هذه الداله ، ربما لأن البرامج التي أقوم بها بسيطه أو لأنه لا توجد حاجه لها في معظم البرامج ، الله أعلم .

روابط مفيده:

Threads and Swing

What exactly is the "Event Dispatch" thread (aka "AWT" Thread)?

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 9 أكتوبر 2008 في 11:59

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3

شكرا لك استاذ وجدي عصام على الوقت الذي صرفته على هذا الرد الرائع والمفيد جدا

#4

هل تستطيع أخ وجدي أن تعطي مثال كودي؟؟

فهمت أنه يجب أن نقوم باستخدامها

لكني لم أفهم متى بالضبط

فيا ليت مثال

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

حياكم الله ،

والله جماعه Sun حذرين جد :)ا ، وعلى كلامهم أي تعامل مع Swing يجب أن يكون في EDT ، طبعا لما نتعامل في Listener الكود تلقائي بروح هناك ، لكن لما ننشيء الواجهه في main ، جماعه sun يقولوا لازم تضع الكود في EDT .

From Sun

 

[color= #666666; font-style: italic;]/*

[color= #666666; font-style: italic;] * HelloWorldSwing.java requires no other files. 

[color= #666666; font-style: italic;] */

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.*[color= #339933;];        

 

[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class HelloWorldSwing [color= #009900;]{

    [color= #666666; font-style: italic;]/**

[color= #666666; font-style: italic;]     * Create the GUI and show it.  For thread safety,

[color= #666666; font-style: italic;]     * this method should be invoked from the

[color= #666666; font-style: italic;]     * event-dispatching thread.

[color= #666666; font-style: italic;]     */

    [color= #000000; font-weight: bold;]private [color= #000000; font-weight: bold;]static [color= #000066; font-weight: bold;]void createAndShowGUI[color= #009900;]([color= #009900;]) [color= #009900;]{

        [color= #666666; font-style: italic;]//Create and set up the window.

        [color= #003399;]JFrame frame [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JFrame[color= #009900;]([color= #0000ff;]"HelloWorldSwing"[color= #009900;])[color= #339933;];

        frame.[color= #006633;]setDefaultCloseOperation[color= #009900;]([color= #003399;]JFrame.[color= #006633;]EXIT_ON_CLOSE[color= #009900;])[color= #339933;];

 

        [color= #666666; font-style: italic;]//Add the ubiquitous "Hello World" label.

        [color= #003399;]JLabel label [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JLabel[color= #009900;]([color= #0000ff;]"Hello World"[color= #009900;])[color= #339933;];

        frame.[color= #006633;]getContentPane[color= #009900;]([color= #009900;]).[color= #006633;]add[color= #009900;](label[color= #009900;])[color= #339933;];

 

        [color= #666666; font-style: italic;]//Display the window.

        frame.[color= #006633;]pack[color= #009900;]([color= #009900;])[color= #339933;];

        frame.[color= #006633;]setVisible[color= #009900;]([color= #000066; font-weight: bold;]true[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]static [color= #000066; font-weight: bold;]void main[color= #009900;]([color= #003399;]String[color= #009900;][[color= #009900;]] args[color= #009900;]) [color= #009900;]{

        [color= #666666; font-style: italic;]//Schedule a job for the event-dispatching thread:

        [color= #666666; font-style: italic;]//creating and showing this application's GUI.

        javax.[color= #006633;]swing.[color= #003399;]SwingUtilities.[color= #006633;]invokeLater[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]Runnable[color= #009900;]([color= #009900;]) [color= #009900;]{

            [color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void run[color= #009900;]([color= #009900;]) [color= #009900;]{

                createAndShowGUI[color= #009900;]([color= #009900;])[color= #339933;];

            [color= #009900;]}

        [color= #009900;]}[color= #009900;])[color= #339933;];

    [color= #009900;]}

[color= #009900;]}

المثال بس بيطلع JFrame فيه JLabel :

1helloworldswing.png

وهكذا لأي مثال في Sun ، جميع الأمثله الخاصه مع التعامل مع Swing بهذا الشكل :

http://java.sun.com/docs/books/tutorial/uiswing/index.html

بالنسبه لي لن أستخدمها لأني أحب المشاكل :P

تحياتي ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6

السلام عليكم

فقط أحببت أن أضيف هذه التدوينة

كتبتها بعد أن بحثت في الموضوع

http://modonat-alaa.freehostia.com/2008/10...8a%d8%ad%d8%a9/

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png