إعلان
دورة تطوير التطبيقات باستخدام لغة JavaScript في هذه الدورة ستتعلم لغة جافا سكريبت, استخدام مكتبة React.js, بناء API الموقع بواسطة Node.js, تطوير تطبيق جوال باستخدام React Native, و في نهاية الدورة ستتعلم تطوير تطبيق محادثة شبيه بتطبيق WhatsApp. تعلم الآن
دورة تطوير واجهات المستخدم في هذه الدورة ستتعلم لغة HTML و لغة CSS و لغة JavaScript. من ناحية التطبيق العملي ستتعلم طريقة بناء واجهة متجر إلكتروني مكون من ست صفحات, تحويل خمسة تصاميم PSD إلى صفحات ويب, بناء واجهة مستخدم تشبه موقع يوتيوب, بناء لوحة تحكم إحترافية. تعلم الآن
تطوير تطبيقات باستخدام لغة بايثون في هذه الدورة ستتعلم أساسيات البرمجة بلغة بايثون وصولاً إلى التعامل مع أشهر أطر العمل (Flask و Django) و ستتعلم كيف تبني متجر إلكتروني يمكن للمستخدمين البيع و الشراء من خلاله. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة PHP في هذه الدورة ستتعلم لغة PHP من الصفر, استخدام إطار العمل Laravel بشرح مفصّل و عملي, كيفية تطوير شبكة اجتماعية تشبه Instagram, بناء API لتطبيق جوال وفق أسلوب RESTful, تطوير موقع إعلانات مبوبة, تطوير نظام إدارة محتوى CMS كامل. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة Ruby في هذه الدورة ستتعلم البرمجة بلغة Ruby إنطلاقاً من أبسط المفاهيم وحتى بناء تطبيق حقيقي, إستخدام إطار العمل Ruby on Rails بشرح مفصّل و عملي, بناء تطبيق حقيقي عبارة عن شبكة اجتماعية تشبه تويتر, تطوير مجتمع الكتروني يشبه حسوب I/O. تعلم الآن
دورة علوم الحاسوب هذه الدورة معدة لتكون مدخل لعلوم الحاسوب و لغات البرمجة حيث ستتعرف فيها على أنظمة التشغيل و ستتعمق في نظام لينكس و في كيفية التعامل معه من خلال موجه الأوامر, بالإضافة إلى قواعد البيانات و أساسيات الشبكات و الخوادم و مبادئ الحماية والأمان في الويب. تعلم الآن

    Swing حل مشكلة المزامنة

    مفهوم مشكلة المزامنة

    عند برمجة تطبيق كبير فإنك حتماً ستحتاج إلى تنفيذ عدة أوامر في وقت واحد, أي ستحتاج إلى إستخدام Threads.
    فمثلاً قد تجعل برنامجك يتعامل مع قاعدة بيانات و يتصل بالنت في نفس الوقت. هنا طبعاً ستضطر إلى تنفيذ كل عملية منهم ضمن Thread مختلف حتى تتمكن من تشغيلهم في نفس الوقت.


    معلومة تقنية

    تشغيل عدة Threads في نفس الوقت قد يتنج عنه مشكلة التضارب ( Conflict ) و التي تحدث عند وجود إثنين Threads يتنفذون في نفس الوقت و وصلوا إلى مرحلة أصبح فيها كل Thread منهم بحاجة إلى إستخدام شيء يستخدمه الـ Thread الآخر.

    فعلياً, مشكلة التضارب تحدث في حال لم نجعل الـ Threads يعملون بشكل متزامن Synchronized إذا كانوا سيستخدمون بعض المصادر المشتركة أثناء عملهم.

    جميع الأشياء المتوفرة في الـ Swing و التي يمكن إضافتها في النافذة لا تتنفذ بشكل متزامن الأمر الذي قد يؤدي إلى تعليق البرنامج في حال إستخدام Threads يستخدمون مصادر مشتركة.

    الطريقة الأولى لحل مشكلة المزامنة

    الخطوات التي عليك فعلها في حال كنت لا تريد وراثة الكلاس JFrame:

    1. إفعل import للكلاس SwingUtilities.
    2. قم ببناء دالة نوعها private static void و أعطها أي إسم تريد, ثم ضع فيها كل الكود الذي يجب أن تكتبه لبناء النافذة.
    3. في الدالة main() قم بإستدعاء الدالة invokeLater() و مرر لها كائن من الإنترفيس Runnable و إفعل Override للدالة run() و إجعلها فقط تستدعي الدالة التي تبني النافذة.

    import javax.swing.SwingUtilities;
    
    public class Main {
    
        private static void createAndShowGUI() {
            // هنا نضع كود إنشاء النافذة و محتوياتها
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // هنا نقوم فقط بإستدعاء الدالة التي تنشئ النافذة
                    createAndShowGUI();
                }
            });
        }
    } 
    	

    المثال التالي يعلمك طريقة تجهيز محتوى الـ Frame ليعمل بشكل متزامن.

    مثال

    Main.java
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.FlowLayout;
    import javax.swing.SwingUtilities;
     
    public class Main {
     
        // هنا نضع كود إنشاء النافذة و محتوياتها
        private static void createAndShowGUI() {
            JFrame f = new JFrame();                            // أي قمنا بإنشاء نافذة JFrame هنا أنشأنا كائن من الكلاس
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // هنا جعلنا زر الخروج من النافذة يغلق البرنامج
            f.setSize(300, 200);                                // هنا قمنا بتحديد حجم النافذة. عرضها 300 و طولها 200
            f.setLayout(new FlowLayout());                      // لترتيب الأشياء التي نضيفها بداخلها FlowLayout هنا جعلنا النافذة تستخدم الـ
     
            // Buttons هنا قمنا بتعريف إثنين
            JButton b1 = new JButton("Button 1");
            JButton b2 = new JButton("Button 2");
     
            // في النافذة Buttons هنا قمنا بإضافة الـ
            f.add(b1);
            f.add(b2);
     
            // هنا جعلنا النافذة مرئية
            f.setVisible(true);
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // هنا نقوم فقط بإستدعاء الدالة التي تنشئ النافذة
                    createAndShowGUI();
                }
            });
        }
     
    }
    		

    ستظهر لك النافذة التالية عند التشغيل.

    طريقة جعل محتوى ال JFrame متزامن في جافا

    الطريقة الثانية لحل مشكلة المزامنة

    الخطوات التي عليك فعلها في حال كنت تريد وراثة الكلاس JFrame:

    1. إفعل import للكلاس SwingUtilities.
    2. قم بوارثة الكلاس JFrame.
    3. قم ببناء دالة نوعها private void و أعطها أي إسم تريد, ثم ضع فيها كل الكود الذي يجب أن تكتبه لبناء النافذة.
    4. إجعل الكونستركتور يستدعي الدالة التي تقوم ببناء النافذة.
    5. في الدالة main() قم بإستدعاء الدالة invokeLater() و مرر لها كائن من الإنترفيس Runnable و إفعل Override للدالة run(), ثم قم بإنشاء كائن من الكلاس, و عندها سيقوم الكونستركتور بإستدعاء الدالة التي تبني النافذة.

    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    public class Main extends JFrame {
    
        public Main() {
            createAndShowGUI();
        }
    
        private void createAndShowGUI() {
            // هنا نضع كود إنشاء النافذة و محتوياتها
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // هنا نقوم فقط بإستدعاء الدالة التي تنشئ النافذة
                    new Main();
                }
            });
        }
    } 
    	

    المثال التالي يعلمك طريقة تجهيز محتوى الـ Frame ليعمل بشكل متزامن.

    مثال

    Main.java
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.FlowLayout;
    import javax.swing.SwingUtilities;
     
    // و بالتالي أصبح إنشاء كائن منه يمثل إنشاء نافذة JFrame يرث من الكلاس Main هنا جعلنا الكلاس
    public class Main extends JFrame {
     
        // فقط createAndShowGUI() سيقوم الكونستركتور بإستدعاء الدالة Main عند إنشاء كائن من الكلاس
        public Main() {
            createAndShowGUI();
        }
     
        // هنا نضع كود إنشاء النافذة و محتوياتها
        private void createAndShowGUI() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // هنا جعلنا زر الخروج من النافذة يغلق البرنامج
            setSize(300, 200);                                // هنا قمنا بتحديد حجم النافذة. عرضها 300 و طولها 200
            setLayout(new FlowLayout());                      // لترتيب الأشياء التي نضيفها بداخلها FlowLayout هنا جعلنا النافذة تستخدم الـ
     
            // Buttons هنا قمنا بتعريف إثنين
            JButton b1 = new JButton("Button 1");
            JButton b2 = new JButton("Button 2");
     
            // في النافذة Buttons هنا قمنا بإضافة الـ
            add(b1);
            add(b2);
     
            // هنا جعلنا النافذة مرئية
            setVisible(true);
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // createAndShowGUI() هنا سيقوم الكونستركتور بإستدعاء الدالة .Main هنا نقوم فقط بإنشاء كائن من الكلاس
                    new Main();
                }
            });
        }
     
    }
    		

    ستظهر لك النافذة التالية عند التشغيل.

    طريقة جعل محتوى ال JFrame متزامن في جافا


    ملاحظة

    إذا كنت تستخدم الـ GUI Builder الموجود في برنامج الـ Net Beans لبناء واجهة المستخدم, ستلاحظ أنه يراعي مشكلة المزامنة إذا إضطلعت على الأوامر التي يكتبها عنك كلما أضفت شيئاً جديداً.
    كما أنه يقوم بتسمية الدالة التي يضع فيها كود إنشاء النافذة initComponents().


    إذاً إلى هنا, أنت تعلمت كيف تبني واجهة مستخدم بواسطة الـ Swing و تعرفت على مختلف الأشياء التي يمكن إضافتها في الواجهة.
    في الدرس التالي ستتعلم كيف تقوم ببناء برامج و ألعاب بسيطة بواسطة الـ Swing حتى تعرف كيف تستفيد من كل ما تعلمته سابقاً في البرامج التي قد تبنيها مستقبلاً.

    إعلان

    Eqla3Tech.com

    شروحات مكتوبة حول لغات البرمجة و تقنية المعلومات باللغة العربية مقدمة من إقلاع تك.

    لغة جافا لغة ++C قواعد البيانات نظام ويندوز نظام لينكس الشبكات تقنية المعلومات الأمن السيبراني

    الدورات

    أدوات مساعدة

    الأقسام

    دورات
    مقالات أسئلة مشاريع كتب