ممكن شرح وظيفة هذه الدالة وما أهميتها
SwingUtilities.invokeLater(Runable)
ممكن شرح وظيفة هذه الدالة وما أهميتها
SwingUtilities.invokeLater(Runable)
تم تعديل هذه المشاركة بواسطة علاء الصالحي في 10 نوفمبر 2008 في 03:38 — السبب: تغيير عنوان الموضوع وإضافة وسم code
في البدايه قبل أن تتعرف على وظيفه الداله 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
على العموم ، بالنسبه لى لم أستخدم هذه الداله ، ربما لأن البرامج التي أقوم بها بسيطه أو لأنه لا توجد حاجه لها في معظم البرامج ، الله أعلم .
روابط مفيده:
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
شكرا لك استاذ وجدي عصام على الوقت الذي صرفته على هذا الرد الرائع والمفيد جدا
هل تستطيع أخ وجدي أن تعطي مثال كودي؟؟
فهمت أنه يجب أن نقوم باستخدامها
لكني لم أفهم متى بالضبط
فيا ليت مثال
تحياتي
حياكم الله ،
والله جماعه Sun حذرين جد :)ا ، وعلى كلامهم أي تعامل مع Swing يجب أن يكون في EDT ، طبعا لما نتعامل في Listener الكود تلقائي بروح هناك ، لكن لما ننشيء الواجهه في main ، جماعه sun يقولوا لازم تضع الكود في EDT .
[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 :

وهكذا لأي مثال في 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
السلام عليكم
فقط أحببت أن أضيف هذه التدوينة
كتبتها بعد أن بحثت في الموضوع
http://modonat-alaa.freehostia.com/2008/10...8a%d8%ad%d8%a9/
تحياتي