سوينغ (جافا)

أمثلة على عناصر واجهة المستخدم Swing في جافا

Swing هي مجموعة أدوات واجهة المستخدم الرسومية للغة Java . [ 1 ] وهي جزء من فئات Java Foundation Classes (JFC) من Oracle - وهي واجهة برمجة تطبيقات لتوفير واجهة مستخدم رسومية (GUI) لبرامج Java. 

طُوِّرت Swing لتوفير مجموعة أكثر تطورًا من مكونات واجهة المستخدم الرسومية مقارنةً بـ Abstract Window Toolkit (AWT) السابقة . توفر Swing مظهرًا وتجربة استخدام تحاكي مظهر وتجربة استخدام العديد من المنصات، كما تدعم ميزة تخصيص المظهر والتجربة التي تسمح للتطبيقات بالحصول على مظهر وتجربة استخدام مستقلة عن المنصة الأساسية. تتميز Swing بمكونات أكثر قوة ومرونة من AWT. فبالإضافة إلى المكونات المألوفة مثل الأزرار ومربعات الاختيار والتسميات، توفر Swing العديد من المكونات المتقدمة مثل اللوحات ذات علامات التبويب، وألواح التمرير، والأشجار، والجداول، والقوائم. [ 2 ]

على عكس مكونات AWT، لا يتم تنفيذ مكونات Swing بواسطة كود خاص بمنصة معينة. بدلاً من ذلك، تتم كتابتها بالكامل بلغة Java، وبالتالي فهي مستقلة عن المنصة.

في ديسمبر 2008، أصدرت شركة صن مايكروسيستمز (سلف أوراكل) إطار عمل قائم على CSS / FXML والذي كانت تنوي أن يكون خليفة لـ Swing، والذي أطلق عليه اسم JavaFX . [ 3 ]

تاريخ

كانت مكتبة فئات مؤسسة الإنترنت ( IFC) مكتبة رسومية للغة جافا، طورتها في الأصل شركة نتسكيب للاتصالات ، وأصدرتها لأول مرة في 16 ديسمبر 1996. وفي 2 أبريل 1997، أعلنت شركتا صن مايكروسيستمز ونتسكيب للاتصالات عن نيتهما دمج مكتبة IFC مع تقنيات أخرى لتشكيل مكتبة فئات مؤسسة جافا . [ 4 ] أُعيد تسمية "مكتبة فئات مؤسسة جافا" لاحقًا إلى "سوينغ".

قدمت Swing آلية تسمح بتغيير مظهر كل مكون في التطبيق دون إجراء تغييرات جوهرية على كود التطبيق. يتيح دعم المظهر القابل للتخصيص لمكونات Swing محاكاة مظهر المكونات الأصلية مع الحفاظ على مزايا استقلالية النظام الأساسي. كانت Swing تُوزع في الأصل كمكتبة قابلة للتنزيل بشكل منفصل، ثم أصبحت جزءًا من Java Standard Edition منذ الإصدار 1.2. [ 5 ] تُضمّن فئات ومكونات Swing في تسلسل هرمي javax.swingللحزم .

بدأ تطوير JavaFX ، خليفة Swing ، في عام 2005، وتم تقديمه رسميًا بعد عامين في مؤتمر JavaOne 2007. [ 6 ] تم طرح JavaFX كمصدر مفتوح في عام 2011، وفي عام 2012، أصبح جزءًا من حزمة Oracle JDK. يحل JavaFX محل Swing نظرًا لعدة مزايا، منها خفته، ودعمه لتنسيق CSS ، وأدوات التحكم الأنيقة في التصميم، واستخدامه لـ FXML و Scene Builder. [ 3 ] في عام 2018، أُدرج JavaFX ضمن مشروع OpenJDK لتسريع وتيرة تطويره. [ 7 ]

ضمّ فريق Java Client المسؤول عن Swing كلاً من جيمس جوسلينج (مهندس معماري)، وريك ليفنسون (مدير)، وإيمي فاولر وهانز مولر (قائدان تقنيان مشاركان)، وتوم بول، وجيف دينكينز، وجورج صعب، [ 8 ] وتيم برينزينج، وجوني كانيرفا، وجانيت هانغ وجيم جراهام (رسومات ثنائية الأبعاد). [ 9 ]

بنيان

Swing هو إطار عمل واجهة مستخدم رسومية مستقل عن المنصة، يعتمد على نموذج " النموذج-العرض-المتحكم " للغة جافا، ويتبع نموذج برمجة أحادي الخيوط . [ 10 ] بالإضافة إلى ذلك، يوفر هذا الإطار طبقة تجريد بين بنية الكود والعرض الرسومي لواجهة المستخدم الرسومية المبنية على Swing.

المؤسسات

يُعدّ Swing مستقلاً عن المنصة لأنه مكتوب بالكامل بلغة Java. يمكن الاطلاع على التوثيق الكامل لجميع فئات Swing في دليل Java API للإصدار 6 أو مواصفات Java Platform Standard Edition 8 API للإصدار 8.

قابل للتمديد

Swing عبارة عن بنية معيارية للغاية، تسمح بـ "توصيل" تطبيقات مخصصة متنوعة لواجهات إطار العمل المحددة: يمكن للمستخدمين توفير تطبيقاتهم المخصصة لهذه المكونات لتجاوز التطبيقات الافتراضية باستخدام آلية الوراثة في Java عبر LookAndFeel.

Swing هو إطار عمل قائم على المكونات ، حيث تُشتق جميع مكوناته في النهاية من JComponentفئة واحدة. تُطلق كائنات Swing الأحداث بشكل غير متزامن، ولها خصائص مرتبطة، وتستجيب لمجموعة موثقة من الطرق الخاصة بكل مكون. مكونات Swing هي مكونات JavaBeans ، متوافقة مع مواصفات JavaBeans .

قابل للتكوين

يُتيح اعتماد Swing الكبير على آليات وقت التشغيل وأنماط التركيب غير المباشر الاستجابةَ الفورية للتغييرات الجوهرية في إعداداته. فعلى سبيل المثال، يُمكن لتطبيق Swing تغيير واجهة المستخدم أثناء التشغيل. علاوة على ذلك، يُمكن للمستخدمين تخصيص مظهر التطبيق، مما يسمح بإجراء تغييرات موحدة على مظهر تطبيقات Swing الحالية دون أي تعديل برمجي على كود التطبيق.

واجهة مستخدم خفيفة الوزن

تتجلى مرونة Swing العالية في قدرتها المتأصلة على تجاوز عناصر واجهة المستخدم الرسومية لنظام التشغيل المضيف لعرض نفسها. تستخدم Swing واجهات برمجة تطبيقات Java ثنائية الأبعاد لرسم عناصر التحكم الخاصة بها، بدلاً من استدعاء مجموعة أدوات واجهة المستخدم الأصلية. وبالتالي، لا يوجد لمكون Swing مكون واجهة مستخدم رسومية مطابق في نظام التشغيل، وهو حر في عرض نفسه بأي طريقة ممكنة باستخدام واجهات المستخدم الرسومية الأساسية.

مع ذلك، يعتمد كل مكون من مكونات Swing في جوهره على حاوية AWT ، لأن حاوية Swing JComponentترث من حاوية AWT. وهذا يسمح لـ Swing بالاندماج مع إطار إدارة واجهة المستخدم الرسومية لنظام التشغيل المضيف، بما في ذلك عمليات ربط الجهاز/الشاشة الأساسية وتفاعلات المستخدم، مثل ضغطات المفاتيح أو حركات الماوس. ببساطة، يقوم Swing بنقل دلالاته الخاصة (غير المرتبطة بنظام تشغيل محدد) إلى المكونات الأساسية (الخاصة بنظام تشغيل محدد). على سبيل المثال، يرسم كل مكون من مكونات Swing نسخته على الجهاز الرسومي استجابةً لاستدعاء الدالة component.paint()، المُعرّفة في حاوية AWT. ولكن على عكس مكونات AWT، التي كانت تُفوّض عملية الرسم إلى عنصر واجهة المستخدم "الثقيل" الخاص بنظام التشغيل، فإن مكونات Swing مسؤولة عن عرضها بنفسها.

لا يقتصر هذا التحويل والفصل على الجانب البصري فحسب، بل يمتد ليشمل إدارة Swing وتطبيق دلالاتها الخاصة المستقلة عن نظام التشغيل للأحداث التي تُطلق ضمن تسلسلات احتواء مكوناتها. وبشكل عام، تُوكل بنية Swing مهمة ربط مختلف أنواع دلالات واجهة المستخدم الرسومية لأنظمة التشغيل بنمط بسيط ولكنه عام إلى حاوية AWT. وانطلاقًا من هذه المنصة العامة، تُنشئ Swing دلالات واجهة المستخدم الرسومية الخاصة بها، الغنية والمعقدة، في شكل النموذج JComponent.

الارتباطات غير المحكمة و MVC

تعتمد مكتبة Swing بشكل كبير على نمط تصميم البرمجيات MVC (نموذج-عرض-متحكم) [ 11 ] ، الذي يفصل البيانات المعروضة عن عناصر واجهة المستخدم التي يتم من خلالها عرضها. ولهذا السبب، فإن معظم مكونات Swing لها نماذج مرتبطة بها (محددة باستخدام واجهات Java )، ويمكن للمبرمجين استخدام تطبيقات افتراضية متنوعة أو توفير تطبيقاتهم الخاصة. يوفر إطار العمل تطبيقات افتراضية لواجهات النماذج لجميع مكوناته الملموسة. لا يتطلب الاستخدام المعتاد لإطار عمل Swing إنشاء نماذج مخصصة، حيث يوفر إطار العمل مجموعة من التطبيقات الافتراضية المرتبطة تلقائيًا، وبشكل شفاف، بالفئة الفرعية المقابلة في مكتبة Swing. بشكل عام، قد تتطلب المكونات المعقدة فقط، مثل الجداول والأشجار وأحيانًا القوائم، تطبيقات نماذج مخصصة لهياكل البيانات الخاصة بالتطبيق. لفهم الإمكانيات التي تتيحها بنية Swing، تخيل حالة افتراضية حيث تكون النماذج المخصصة للجداول والقوائم عبارة عن أغلفة لخدمات DAO و/أو EJB .JComponent

عادةً، تتولى كائنات نموذج مكونات Swing مسؤولية توفير واجهة موجزة تُعرّف الأحداث المُفعّلة والخصائص المتاحة لنموذج البيانات (المفاهيمي) لاستخدامها من قِبل مكون JComponent المرتبط. ونظرًا لأن نمط MVC العام هو نمط علاقة كائنات تعاونية غير مترابطة بشكل كبير، فإن النموذج يوفر الوسائل البرمجية لربط مستمعي الأحداث بكائن نموذج البيانات. وتتمحور هذه الأحداث حول النموذج (على سبيل المثال: حدث "إدراج صف" في نموذج جدول) ويتم ربطها بواسطة تخصص JComponent إلى حدث ذي معنى لمكون واجهة المستخدم الرسومية.

على سبيل المثال، JTableيحتوي هذا النموذج على واجهة تُسمى تُحدد كيفية وصول الجدول إلى البيانات الجدولية. ويعمل التنفيذ الافتراضي لهذه الواجهة على مصفوفةTableModel ثنائية الأبعاد .

يُعدّ عنصر العرض في Swing JComponent الكائن المستخدم لتمثيل عنصر واجهة المستخدم الرسومية بشكل مرئي. يتميز Swing، كإطار عمل لواجهة المستخدم الرسومية، باعتماده على عناصر واجهة المستخدم الرسومية المُنشأة برمجيًا (بدلاً من استخدام عناصر واجهة المستخدم الرسومية الأصلية لنظام التشغيل). قبل تحديث Java 6 Update 10 ، كان هذا التمييز مصدرًا للتعقيدات عند دمج عناصر تحكم AWT، التي تستخدم عناصر تحكم أصلية، مع عناصر تحكم Swing في واجهة المستخدم الرسومية (انظر: دمج مكونات AWT وSwing ).

أخيرًا، فيما يتعلق بالتكوين المرئي وإدارته، يُفضّل Swing التخطيطات النسبية (التي تُحدد العلاقات المكانية بين المكونات) على التخطيطات المطلقة (التي تُحدد الموقع والحجم الدقيقين للمكونات). ويعود هذا الميل نحو الترتيب المرئي "المرن" إلى أصوله في بيئة تشغيل التطبيقات المصغّرة التي شكّلت أساس تصميم وتطوير مجموعة أدوات واجهة المستخدم الرسومية الأصلية في Java. (من الناحية المفاهيمية، يُشابه هذا المنظور لإدارة التخطيط إلى حد كبير المنظور الذي يُوجّه عرض محتوى HTML في المتصفحات، ويتناول نفس مجموعة الاعتبارات التي حفّزت الأول).

العلاقة بـ AWT

التسلسل الهرمي لفئات AWT و Swing

منذ الإصدارات الأولى من لغة جافا، وفر جزء من مجموعة أدوات النوافذ المجردة (AWT) واجهات برمجة تطبيقات مستقلة عن النظام الأساسي لمكونات واجهة المستخدم. في AWT، يتم عرض كل مكون والتحكم فيه بواسطة مكون نظير أصلي خاص بنظام النوافذ الأساسي.

على النقيض من ذلك، غالبًا ما توصف مكونات Swing بأنها خفيفة الوزن لأنها لا تتطلب تخصيص موارد أصلية في مجموعة أدوات النوافذ الخاصة بنظام التشغيل. أما مكونات AWT فتُعرف بأنها مكونات ثقيلة الوزن . [ 12 ]

تُعدّ واجهة برمجة تطبيقات Swing في معظمها امتدادًا تكميليًا لـ AWT وليست بديلًا مباشرًا عنها. في الواقع، توجد كل واجهة Swing خفيفة الوزن ضمن مكون AWT ثقيل الوزن، لأن جميع المكونات الرئيسية في Swing (مثل `<Swing> JApplet` JDialogو` <Swing> JFrame` و` JWindow<Swing>`) تُوسّع حاوية AWT الرئيسية. قبل تحديث Java 6 Update 10 ، كان يُنصح عمومًا بتجنب استخدام كلٍ من المكونات الخفيفة والثقيلة الوزن في نفس النافذة بسبب عدم توافق ترتيب العناصر (Z-order) . مع ذلك، عالجت الإصدارات اللاحقة من Java هذه المشكلات، وأصبح بالإمكان الآن استخدام مكونات Swing وAWT في واجهة مستخدم رسومية واحدة دون مشاكل في ترتيب العناصر.

يتم توفير وظائف العرض الأساسية التي يستخدمها Swing لرسم مكوناته الخفيفة بواسطة Java 2D ، وهو جزء آخر من JFC.

العلاقة بـ SWT

تُعدّ مجموعة أدوات الأدوات القياسية (SWT) مجموعة أدوات منافسة طُوّرت في الأصل بواسطة شركة IBM ، ويتولى مجتمع Eclipse صيانتها حاليًا . يتشابه تطبيق SWT إلى حد كبير مع المكونات الأساسية لمجموعة أدوات AWT. وهذا يُتيح مزايا مثل دقة أعلى في التوافق مع مجموعة أدوات النوافذ الأصلية، على حساب زيادة الاعتماد على النظام الأساسي في نموذج البرمجة.

دار نقاش وتكهنات واسعة حول أداء SWT مقارنةً بـ Swing؛ إذ أشار البعض إلى أن اعتماد SWT الكبير على JNI قد يُبطئها عند تبادل البيانات بين مكون واجهة المستخدم الرسومية وجافا، ولكنه يُسرّع عملية العرض عند تحميل نموذج البيانات في واجهة المستخدم الرسومية، إلا أن هذا لم يُؤكد بعد. [ 13 ] وخلصت مجموعة شاملة من الاختبارات المعيارية في عام 2005 إلى أن أداء أيٍّ من Swing أو SWT ليس متفوقًا بشكل واضح على الآخر في الحالة العامة. [ 14 ]

أمثلة

مرحبا بالعالم

يقوم تطبيق Swing هذا بإنشاء نافذة واحدة تحتوي على عبارة "Hello, world!":

// Hello.java (Java SE 8) import javax.swing.* ;public class Hello extends JFrame { public Hello () { super ( "Hello World" ); setDefaultCloseOperation ( WindowConstants . EXIT_ON_CLOSE ); add ( new JLabel ( "Hello, world!" )); pack (); setVisible ( true ); }public static void main ( String [] args ) { SwingUtilities . invokeLater ( Hello :: new ); } }

يتضمن الأول importجميع الفئات والواجهات العامة من javax.swingالحزمة.

الفئة Helloالفئة extends؛ JFrameالفئة JFrameتنفذ نافذة مع شريط عنوان وزر إغلاق .

Hello()يقوم المُنشئ بتهيئة الإطار عن طريق استدعاء مُنشئ الفئة الأصلية أولاً، مع تمرير المُعامل "Hello World"الذي يُستخدم كعنوان للنافذة. ثم يستدعي الدالة setDefaultCloseOperation(int)الموروثة من الفئة JFrameالأصلية لتعيين العملية الافتراضية عند تحديد زر الإغلاق في شريط العنوان - مما يؤدي إلى التخلص من العنصر عند إغلاق الإطار (بدلاً من إخفائه فقط)، وهو ما يسمح لآلة جافا الافتراضية بالخروج وإنهاء البرنامج. بعد ذلك، يتم إنشاء عنصر للسلسلة النصية "Hello, world!" ، ويتم استدعاء الدالة الموروثة من الفئة الأصلية لإضافة التسمية إلى الإطار. ثم يتم استدعاء الدالة الموروثة من الفئة الأصلية لتحديد حجم النافذة وتنسيق محتوياتها. وأخيرًا، يتم استدعاء الدالة الموروثة من الفئة الأصلية مع المُعامل المنطقي ، مما يؤدي إلى عرض الإطار.WindowConstants.EXIT_ON_CLOSE JFrameJLabeladd(Component)Containerpack()WindowsetVisible(boolean)Componenttrue

يتم استدعاء هذه main()الطريقة بواسطة آلة جافا الافتراضية عند بدء تشغيل البرنامج. تقوم هذه الطريقة بإنشاء إطار جديد Hello. يستخدم الكود هذه invokeLater(Runnable)الطريقة لاستدعاء المُنشئ من سلسلة عمليات إرسال أحداث AWT لضمان تنفيذ الكود بطريقة آمنة للخيوط . بمجرد عرض الإطار، mainلا يؤدي الخروج من هذه الطريقة إلى إنهاء البرنامج لأن سلسلة عمليات إرسال الأحداث تظل نشطة حتى يتم إغلاق جميع نوافذ Swing الرئيسية.

نافذة مع زر

نموذج التعليمات البرمجية الأساسي الذي يعمل على نظام التشغيل ويندوز 7

فيما يلي برنامج بسيط يعتمد على Swing. يعرض نافذة (a JFrame) تحتوي على تسمية وزر.

import java.awt.FlowLayout ; import javax.swing.JButton ; import javax.swing.JFrame ; import javax.swing.JLabel ; import javax.swing.WindowConstants ; import javax.swing.SwingUtilities ; public class SwingExample implements Runnable { @Override public void run () { // إنشاء النافذة JFrame f = new JFrame ( "Hello World!" ); // تحديد سلوك إغلاق النافذة f.setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE ); // إضافة مدير تخطيط بحيث لا يتم وضع الزر فوق التسمية f.setLayout ( new FlowLayout ( ) ); // إضافة تسمية وزر f.add ( new JLabel ( " Hello , world ! " ) ); f.add ( new JButton ( "Press me!" ) ); // ترتيب المكونات داخل النافذة f.pack (); // بشكل افتراضي، النافذة غير مرئية. اجعلها مرئية. f.setVisible ( true ) ; } public static void main ( String [ ] args ) { // جدولة تشغيل التطبيق في الوقت المناسب في قائمة انتظار الأحداث. SwingUtilities.invokeLater ( new SwingExample ( ) ) ; }}

لاحظ كيف تتم جميع عمليات إنشاء مكونات Swing ومعالجتها من خلال تطبيق واجهة Runnable. ثم يتم تشغيلها على سلسلة معالجة الأحداث باستخدام الدالة SwingUtilities.invokeLater(Runnable)`run` المُنشأة في الدالة الرئيسية (انظر Swing وأمان الخيوط ). على الرغم من إمكانية تشغيل كود Swing دون استخدام هذه التقنية (على سبيل المثال، بعدم تطبيق Runnable ونقل جميع الأوامر من دالة `run` إلى الدالة الرئيسية)، إلا أن ذلك يُعتبر ممارسة جيدة، لأن Swing غير آمن للخيوط ، مما يعني أن استدعاء الموارد من خيوط متعددة قد يؤدي إلى تداخل الخيوط وأخطاء في اتساق الذاكرة. [ 15 ]

حقل نصي

تُمكّن حقول النص المستخدمين من إدخال النصوص أو البيانات في تطبيقك. إنشاء حقل نص في Swing أمر بسيط - قم بإنشاء كائن JTextField وأضفه إلى حاوية.

استيراد javax.swing.* ;public class TextFieldExample { public static void main ( String [] args ) { SwingUtilities . invokeLater (() -> { // إنشاء إطار JFrame JFrame frame = new JFrame ( "مثال حقل نصي" );// إنشاء حقل نص JTextField JTextField textField = new JTextField ( 20 );// أضف حقل النص إلى إطار JFrame . أضف ( حقل النص // اضبط حجم إطار JFrame واجعله مرئيًا frame.setSize ( 300 , 200 ); frame.setVisible ( true ) ; } ) ; } }

يُحسّن تعزيز وظائف حقول النصوص من تفاعل المستخدم. من خلال ربط واجهات DocumentListener، يمكنك مراقبة التغييرات في محتوى النص بشكل ديناميكي، مما يتيح التحقق من صحة البيانات المدخلة وتنسيقها وإكمالها تلقائيًا في الوقت الفعلي.

يُعدّ التحقق من صحة مدخلات حقول النص أمرًا بالغ الأهمية لضمان سلامة البيانات ومنع الأخطاء. توفر Swing تقنيات تحقق متعددة، بما في ذلك التعابير النمطية، وأقنعة الإدخال، أو منطق التحقق المخصص. من خلال تطبيق واجهات InputVerifier، يمكنك تحديد قواعد تحقق محددة وتقديم ملاحظات فورية للمستخدمين عند إدخال بيانات غير صالحة. [ 16 ]

مثال آخر

في هذا المثال، لنفترض أن javax.swing.JFrame هي الفئة الأساسية ونضيف إليها عنصر واجهة المستخدم الخاص بنا (في هذه الحالة، JButton).

استيراد javax.swing.JFrame ؛ استيراد javax.swing.JButton ؛ استيراد javax.swing.JOptionPane ؛ استيراد javax.swing.SwingUtilities ؛استيراد java.awt.event.ActionListener ؛ استيراد java.awt.event.ActionEvent ؛public class Sample extends JFrame { public Sample () { super (); this . setTitle ( "HelloApp" ); this . getContentPane (). setLayout ( null ); this . setBounds ( 100 , 100 , 180 , 140 ); this . add ( makeButton ()); this . setVisible ( true ); this . setDefaultCloseOperation ( EXIT_ON_CLOSE ); }private JButton makeButton () { final JButton b = new JButton (); b.setText ( "انقر هنا!" ) ; b.setBounds ( 40 , 40 , 100 , 30 ) ; b.addActionListener ( ( ActionEvent e ) - > JOptionPane.showMessageDialog ( b , " مرحباً بالعالم !" ) ); return b ; }public static void main ( String [] args ) throws InvocationTargetException , InterruptedException { // يجب تشغيل استدعاءات Swing بواسطة سلسلة معالجة الأحداث. SwingUtilities . invokeAndWait (() -> new Sample ()); } }

يتم تعيين التخطيط إلى قيمة فارغة باستخدام هذه Container.setLayout(LayoutManager)الطريقة، لأن JFrame يستخدم java.awt.BorderLayout كمدير تخطيط افتراضي. مع BorderLayout، يتم وضع أي عنصر يُضاف إلى الحاوية في المنتصف ويتم تمديده لاستيعاب أي عناصر واجهة مستخدم أخرى. تفضل معظم تطبيقات واجهة المستخدم الرسومية في العالم الحقيقي استخدام مدير تخطيط بدلاً من وضع كل شيء على إحداثيات مطلقة. [ 17 ]

انظر أيضاً

مراجع

الاقتباسات

  1. "ما هو Java Swing؟ - تعريف من Techopedia" . Techopedia Inc. تم الاطلاع عليه بتاريخ 2018-11-03 .
  2. ياب، تشي (30 أبريل 2003). "دليل تعليمي لواجهة المستخدم الرسومية باستخدام جافا سوينغ" . جامعة نيويورك . تم الاطلاع عليه بتاريخ 3 نوفمبر 2018 .
  3. 1 2 "تطوير تطبيق واجهة مستخدم رسومية أساسي باستخدام JavaFX في Eclipse" . يوليو 2017.
  4. "شركة صن ونتسكيب تتعاونان لتطوير فئات جافا الأساسية" . شركة نتسكيب للاتصالات . 2 أبريل 1997. مؤرشف من الأصل في 9 مايو 2012. تم الاطلاع عليه في 8 أغسطس 2011 .
  5. "صن تُقدّم الإصدار التالي من منصة جافا" . صن مايكروسيستمز . أغسطس 2007. مؤرشف من الأصل في 16 أغسطس 2007. تم الاطلاع عليه بتاريخ 8 يناير 2012. تُعدّ فئات جافا الأساسية الآن جزءًا لا يتجزأ من منصة جافا 2 ، وتشمل: مجموعة مكونات واجهة المستخدم الرسومية Project Swing، وخاصية السحب والإفلات، وواجهة برمجة تطبيقات جافا ثنائية الأبعاد التي توفر إمكانيات رسومات ثنائية الأبعاد وAWT جديدة، بالإضافة إلى دعم الطباعة، وواجهة جافا ذات المظهر والشعور، وواجهة برمجة تطبيقات جديدة لإمكانية الوصول.
  6. غابرييلا موتروك (8 مارس 2018). "تحديث JDK 11: سيتم فصل JavaFX عن JDK" . مؤرشف من الأصل بتاريخ 26 مارس 2019.
  7. سميث، دونالد (7 مارس 2018). "مستقبل JavaFX وتحديثات خارطة طريق عميل Java الأخرى" .
  8. زاخور، شارون. "لماذا سُميت Swing بهذا الاسم؟" . مدونة دروس جافا . تم الاطلاع عليه بتاريخ 24 سبتمبر 2020 .
  9. جون، يو (27 أغسطس 2003). "ظهور تطبيقات الويب الغنية كبدائل لتطبيقات الويب" . مجلة كمبيوتر وورلد . تم الاطلاع عليه بتاريخ 24 سبتمبر 2020 .
  10. زوكوفسكي، جون (21 أغسطس 2007). "الترابط في Swing وخيط إرسال الأحداث" . JavaWorld . تم الاسترجاع في 26 يوليو 2020 .
  11. فاولر، آمي. "نظرة عامة على بنية سوينغ" . صن مايكروسيستمز . تم الاسترجاع في 26 يوليو 2020 .
  12. زاخور، شارون؛ بيتروف، أنتوني (أبريل 2010). "مزج المكونات الثقيلة والخفيفة" . أوراكل . تم الاسترجاع في 26 يوليو 2020 .
  13. سترين، ستيفن (3 مارس 2006). "أداء Swing مقابل SWT - ألقِ نظرة على مكدسات الاستدعاء" . جافالوبي . مؤرشف من الأصل في 17 سبتمبر 2017.
  14. زاجار، كليمن؛ كريزنار، إيغور (3 مارس 2006). "مقارنة أداء SWT وSwing" (ملف PDF) (الإصدار 1.4 ). كوزيلاب. مؤرشف من الأصل (ملف PDF) بتاريخ 26 مايو 2015. من الصعب وضع قاعدة عامة تحدد متى يتفوق SWT على Swing، أو العكس. في بعض البيئات (مثل ويندوز)، يكون SWT هو الأفضل. في بيئات أخرى (لينكس، و VMware التي تستضيف ويندوز)، يتفوق Swing وتحسين إعادة الرسم الخاص به على SWT بشكل ملحوظ. الاختلافات في الأداء كبيرة: من الشائع أن تصل إلى ضعفين أو أكثر، في كلا الاتجاهين. 
  15. "خيط إرسال الأحداث" . docs.oracle.com .
  16. https://geeksprogramming.com/java-swing-tutorial-for-beginners/ خيط إرسال الأحداث
  17. إيكل، بروس (2006). التفكير بلغة جافا (ملف PDF) ( الطبعة الرابعة). برنتيس هول. ص 942. ISBN   978-0131872486تمت أرشفة هذا الملف من النسخة الأصلية (PDF) بتاريخ 14 مايو 2016. تم الاطلاع عليه بتاريخ 13 مايو 2016 .
  18. "الصفحة الرئيسية لمطوري JavaFX" . www.oracle.com .

مصادر