إنشاء لغة جافا. إنشاء واجهة المستخدم الرسومية في مكتبات رسومات جافا

21.08.2020

وصف العرض التقديمي إنشاء واجهة رسومية في مكتبات رسومات Java بواسطة الشرائح

مكتبات Java الرسومية تحتوي Java على الحزم التالية لإنشاء واجهات رسومية: Abstract Windows Toolkit (AWT) - تأتي مع JDK ، كل مكون AWT له مكون مرئي خاص به (نظير) لنظام تشغيل معين ، ويتم توفير إمكانية النقل بواسطة حزمة java. awt. الأقران. مجموعة المكونات الرسومية محدودة ؛ المظهر يعتمد على نظام التشغيل. Standard Widget Toolkit (SWT) - يتم توفيرها بشكل منفصل لنظام تشغيل محدد ، مضمن في بيئة Eclipce ، وتتفاعل مع نظام التشغيل باستخدام واجهات نظير ، على عكس AWT ، تم توسيع نطاق المكونات. Swing - يأتي مع JDK ، ويمتد إلى فئات AWT ، ولا يعتمد على مكونات نظير نظام التشغيل. Java 3 D - رسومات ثلاثية الأبعاد.

مكونات ثقيلة الوزن وخفيفة الوزن مكونات ثقيلة الوزن - يتم تقديمها بواسطة نظام التشغيل - معظم مكونات AWT مكونات خفيفة الوزن (خفيفة الوزن) - يتم تقديمها بواسطة رمز جافا - جميع مكونات التأرجح باستثناء النوافذ عالية المستوى (نافذة التطبيق) يتم دائمًا رسم المكونات الثقيلة فوق المكونات خفيفة الوزن

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

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

التفاعلات بين النموذج والعرض والمتحكم النموذج الكلاسيكي علاقة وثيقة بين المتحكم والنموذج والمتحكم والعرض. يرتبط العرض (العرض) بوحدة تحكم واحدة وكل وحدة تحكم مع طريقة عرض واحدة. العرض والتحكم لهما ارتباط مباشر بالنموذج.

نموذج فئة عامة نموذج MVC (صفيف int. خاص = (1، 2، 3، 4، 5) ؛ الحصول على سلسلة عامة. سلسلة. Array () (إرجاع "int. Array =" + Arrays. to. String (int. صفيف) ؛) مجموعة الفراغ العامة. ؛ Controller () (update.View ()؛) void set.Array.Value (int index، int value) (model.set.Int.Array (index، value)؛ update.View ()؛) void update .View () (view. show. Array (model. get. String. Array ())؛)) public class view (public void show. Array (String array. String) (System. out. println ("View") ؛ System. out .println (array. String)؛ System. out. println ()؛)) public class User (public statc void main (String args) (Controller controller = new Controller ()؛ controller. set. Array. القيمة (1 ، 4) ؛))

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

زر مكونات الواجهة - زر ؛ JCheck. مربع - مربع الاختيار ؛ جي كومبو. صندوق - قائمة منسدلة ؛ JLabel - التسمية والنقش ؛ jList - قائمة ؛ JPassword. حقل - حقل نصي للإدخال المخفي ؛ JProgress. شريط - مكون لعرض رقم في نطاق معين ؛ JRadio. زر - مفاتيح التبديل ، أزرار الاختيار ، وعادة ما تستخدم مع مكون الزر. مجموعة؛ JSlider - مكون يسمح لك بتحديد قيمة من نطاق معين ؛ JTable - طاولة ؛ jtext. الحقل عبارة عن حقل نصي مكون من سطر واحد ؛ jtext. المنطقة عبارة عن حقل نصي متعدد الأسطر ؛ JTree هي شجرة.

حاويات الواجهة أجزاء من واجهة المستخدم تحتوي على مكونات أخرى حاويات المستوى الأعلى: الإطار ، JFrame - نافذة التطبيق ؛ JDialog - مربع حوار التطبيق ؛ jcolor. المنتقي - مربع حوار اختيار اللون ؛ jfile. المنتقي - حوار لاختيار الملفات والدلائل ؛ ملف. حوار - حوار لاختيار الملفات والدلائل (مكون awt). حاويات بسيطة: JPanel - لوحة بسيطة لتجميع العناصر ، بما في ذلك اللوحات المتداخلة ؛ jTool. شريط - شريط الأدوات (عادة الأزرار) ؛ JScroll. جزء - شريط تمرير يسمح لك بتمرير محتويات عنصر فرعي ؛ JDesktop. جزء - حاوية لإنشاء سطح مكتب افتراضي أو تطبيقات تعتمد على MDI (واجهة متعددة المستندات) ؛ JEditor. جزء ، JText. جزء - حاويات لعرض مستند معقد بتنسيق HTML أو RTF ؛ JTabbed. جزء - حاوية لإدارة الإشارات المرجعية ؛

إنشاء نافذة استيراد جافا. awt. * ؛ فئة جدا. بسيط. يمتد الإطار الإطار (public statc void main (String args) (Frame fr = new Too. Simple Too. Frame () ؛ fr. set. Size (400، 150)؛ // window size fr. set. Visible (true)؛ / / تقديم نافذة) // زر الإغلاق لا يعمل) تأرجح

نافذة مع رمز مخصص استيراد جافاكس. تأرجح. * ؛ إطار الطبقة العامة. يؤدي الإغلاق إلى توسيع إطار JFrame (إطار عام. إغلاق () (سوبر ("عنوان النافذة") ؛ // العملية عند إغلاق مجموعة النافذة. افتراضي. إغلاق. عامل تشغيل (EXIT_ON_CLOSE) ؛ // عند إغلاق النافذة ، وخروج // رمز لـ مجموعة النوافذ. Icon.Image (get. Toolkit (). get. Image ("icon. gif")) ؛ // C: / icons / icon. png // display set. Size (300، 100)؛ // window تعيين عرض الحجم والارتفاع. مرئي (صحيح) ؛ / / نافذة العرض) العامة statc void main (سلسلة args) (إطار جديد. إغلاق () ؛)) تأرجح

مربعات الحوار القياسية نوع مربع الحوار الوصف يعرض NFORMATION_MESSAGE مربع الحوار معلومات الأغراض العامة مع رمز من النوع المناسب يعرض مربع الحوار WARNING_MESSAGE معلومات التحذير مع رمز من النوع المناسب QUESTION_MESSAGE مربع الحوار سؤال لإدخال المعلومات ERROR_MESSAGE يعرض مربع الحوار معلومات الخطأ مع رمز من النوع المناسب PLAIN_MESSAGE يشير إلى أن مربع الحوار لا ينتمي إلى أي من الأنواع المذكورة أعلاه. يُعرض على الشاشة بدون رمز قياسي. يمكن أن تكون مربعات الحوار مشروطة أو غير مشروط يمكن أن تكون مربعات الحوار مشروطة (التركيز على النافذة حتى يتم الضغط على الزر) أو غير مشروط

نوافذ الإدخال والرسالة استيراد جافا. awt. * ؛ استيراد جافاكس. تأرجح. * ؛ فئة عامة Soluton (عامة ثابتة باطلة رئيسية (سلاسل سلسلة) (JOpton. جزء. عرض. رسالة. مربع حوار (فارغ ، "مرحبًا ، عالم") ؛ سلسلة s = JOpton. جزء. إظهار. إدخال. مربع حوار ("أدخل اسمك" )؛ ) ) تأرجح

تخطيطات Java القياسية 1. تخطيط الحدود. تخطيط (وضع قطبي). 2. مؤلف التدفق. تخطيط (التنسيب المتتالي). 3. رابط. شبكة. تخطيط (تخطيط الجدول). 4. رابط الربيع. تخطيط (التنسيب النسبي). 5. رابط مربع. تخطيط (كتلة التنسيب).

التخطيط القطبي (تخطيط الحدود والتخطيط) قيمة الحدود والتخطيط. تَخطِيط. NORTH أو السلسلة "North" - يقع المكون على طول الحد العلوي (الشمالي) من النافذة ويمتد إلى عرضه بالكامل. هذا هو المكان الذي يوجد فيه شريط الأدوات عادةً. قيمة الحدود. تَخطِيط. SOUTH أو السلسلة "South" - يقع المكون على طول الحد السفلي (الجنوبي) ويمتد إلى العرض الكامل للنافذة. هذا الموضع مثالي لشريط الحالة. قيمة الحدود. تَخطِيط. WEST أو السلسلة "West" - يقع المكون على طول الحد الأيسر (الغربي) من النافذة ويمتد إلى ارتفاعه بالكامل ، ومع ذلك ، يتم أخذ أحجام المكونات الشمالية والجنوبية في الاعتبار (لها الأولوية). قيمة الحدود. تَخطِيط. EAST أو السلسلة "East" - يقع المكون على طول الحد الأيمن (الشرقي) من النافذة. خلاف ذلك ، فإن موقعه مشابه للمكون الغربي. قيمة الحدود. تَخطِيط. CENTER أو الخط "المركز" - يتم وضع المكون في وسط النافذة ، بحيث يشغل أكبر مساحة ممكنة.

مثال على استخدام تخطيط الحدود. تخطيط استيراد جافاكس. تأرجح. * ؛ استيراد جافا. awt. * ؛ حدود الطبقة العامة. تَخطِيط. يمتد النموذج JFrame (الحدود العامة. التخطيط. نموذج () (ممتاز ("الحدود. التخطيط. نموذج") ؛ تعيين. الحجم (400 ، 300) ؛ تعيين. افتراضي. إغلاق. عامل تشغيل (EXIT_ON_CLOSE) ؛ // الحصول على جزء محتوى الفصل JFrame Container c = get.Content.Pane () ؛ // افتراضيًا ، يستخدم Swing مدير Border.Layout // إضافة مكونات إلى اللوحة باستخدام ثوابت السلسلة c.add (جديد JButton ("الشمال") ، "الشمال") ؛ c. add (new JButton ("South")، "South")؛ // أو ثوابت من class Border. Layout // JLabel لعرض النص c. add (new JLabel ("West")، Border. Layout. WEST)؛ c. add (new JLabel ("East")، Border. Layout. EAST)؛ // إذا لم يتم تحديد المعلمة على الإطلاق ، فسيتم إضافة المكون تلقائيًا إلى المركز c. add (new JButton (" Center ")) ؛ // عرض النافذة على مجموعة الشاشة. مرئي (صحيح) ؛) public statc void main (String args) (new Border.Layout.Sample () ؛)) تأرجح

وضع متسلسل (تدفق. تخطيط تخطيط) مكونات تخطيطات التخطيط من اليسار إلى اليمين ، من أعلى إلى أسفل (افتراضي في Jpanels). استيراد جافاكس. تأرجح. * ؛ استيراد جافا. awt. * ؛ تدفق الطبقة العامة. تَخطِيط. يمتد النموذج JFrame (تدفق عام. تخطيط. نموذج () (ممتاز ("تدفق. تخطيط 1") ؛ تعيين. الحجم (400 ، 200) ؛ تعيين. افتراضي. إغلاق. عامل تشغيل (EXIT_ON_CLOSE) ؛ // الحصول على حاوية لوحة المحتوى c = get.Content.Pane () ؛ // اضبط المكونات لتكون متسلسلة ومحاذاة للوسط c.set.Layout (new Flow.Layout (Flow.Layout.CENTER)) ؛ // أضف المكونات c.add (جديد JButton ("One")) ؛ c. add (new JButton ("Two")) ؛ c. add (new JButton ("Three")) ؛ // عرض مجموعة النوافذ. مرئي (صحيح) ؛) statc public void main (String args) (new Flow.Layout.Sample () ؛)) استيراد java. awt. * ؛ استيراد جافاكس. تأرجح. * ؛ فئة عامة Soluton (عامة ثابتة باطلة رئيسية (سلاسل سلسلة) (JOpton. جزء. عرض. رسالة. مربع حوار (فارغ ، "مرحبًا ، عالم") ؛)) تأرجح

تخطيط الجدول (الشبكة. تخطيط التخطيط) جميع المكونات لها نفس الحجم. يتم تقسيم المساحة المتاحة إلى نفس عدد الخلايا ، حيث يتم وضع المكون في كل منها ؛ يتم دائمًا رسم جميع المكونات على الشاشة ، مهما كانت المساحة المتاحة كبيرة أو صغيرة. استيراد جافا. awt. * ؛ استيراد جافاكس. تأرجح. * ؛ استيراد جافا. utl. * ؛ فئة الشبكة. يمتد الاختبار JFrame (Grid. Test (String s) (super (s) ؛ Container c = get. Content. Pane () ؛ // 4 صفوف 4 أعمدة تباعد بين الصفوف والأعمدة بالبكسل ج. التخطيط (شبكة جديدة. التخطيط (4 ، 4 ، 5 ، 5)) ؛ String. Tokenizer st = String new. Tokenizer ("7 8 9/4 5 6 * 1 2 3 - 0. = +") ؛ بينما (st. لديها المزيد. الرموز ()) c. add (new Button (st. next. Token ()))؛ set. Size (200، 200)؛ set. Visible (true)؛) public statc void main (String args) (new Grid. اختبار ("مدير الشبكة. التخطيط") ؛)) تأرجح

سيعطي التخطيط الجدولي الأزرار الحجم نفسه ، بينما سيمنع التخطيط المتسلسل الأزرار من "التعتيم" وفي نفس الوقت محاذاتها إلى الحافة اليمنى I mport java. awt. * ؛ استيراد جافاكس. تأرجح. * ؛ قيادة الطبقة العامة. تعمل الأزرار على توسيع إطار JFrame (الأمر العام. الأزرار () (فائقة ("أزرار الأوامر") ؛ تعيين. الحجم (350 ، 250) ؛ تعيين. تحديد موقع (150 ، 100) ؛ تعيين. افتراضي. إغلاق. عامل تشغيل (EXIT_ON_CLOSE) ؛ / / إنشاء لوحة بتخطيط جدول لمحاذاة أحجام الأزرار شبكة JPanel جديدة = لوحة JPanel جديدة (شبكة جديدة. تخطيط (1 ، 2 ، 5 ، 0)) ؛ // صف واحد ، عمودان ، 5 بكسل أفقيًا ، 0 عموديًا. // أضف شبكة مكونات. (Flow. Layout. RIGHT)) ؛ flow. add (network) ؛ // الحصول على جزء المحتوى Container c = get. Content. Pane () ؛ // ضع صف الأزرار أسفل النافذة c. add ( flow، Border .Layout.SOUTH)؛ // Display window set.Visible (true)؛) public statc void main (String args) (new Command.Buttons ()؛)) Swing

تخطيط المربع (المربع. تخطيط التخطيط) يضع مدير تخطيط الصندوق المكونات في الحاوية في كتل: عمود (على طول المحور ص) أو شريط (على طول المحور س) ، بينما يمكن محاذاة كل مكون فردي في المركز ، يسارًا أو يمينًا ، وكذلك في الأعلى أو الأسفل.

مثال على وضع الحظر استيراد جافا. awt. * ؛ استيراد جافاكس. تأرجح. * ؛ يمتد الصندوق 1 للفئة العامة JFrame (الصندوق العام 1 () (ممتاز ("Box 1 - Y") ؛ تعيين. الحجم (400 ، 200) ؛ تعيين. افتراضي. إغلاق. مشغل (EXIT_ON_CLOSE) ؛ // احصل على حاوية لوحة المحتوى c = get.Content.Pane () ؛ // تعيين مربع تخطيط y-box.Layout boxy = New Box.Layout (c ، Box.Layout.Y_AXIS) ؛ c.set.Layout (boxy) ؛ // إضافة مكونات c . add (new JButton ("One")) ؛ c. add (new JButton ("Two")) ؛ c. add (new JButton ("Three")) ؛ // عرض مجموعة النافذة. مرئي (صحيح) ؛ ) statc class Box 2 يمتد JFrame (public Box 2 () (super ("Box 2 - X") ؛ // ضبط حجم وموضع مجموعة الصندوق. الحجم (400 ، 200) ؛ تعيين. Locaton (100 ، 100 ) ؛ set.Default.Close.Operaton (EXIT_ON_CLOSE) ؛ // احصل على لوحة المحتوى Container c = get.Content.Pane () ؛ // set box x position (bar) Box.Layout boxx = new Box.Layout (c) ، Box. Layout. X_AXIS)؛ c. set. Layout (boxx)؛ // add المكونات c. add (new JButton ("One"))؛ c. add (new JButton ("Two"))؛ c .add (جديد JButton ("ثلاثة")) ؛ // عرض النافذة على الشاشة. مرئي (صحيح) ؛ )) public statc void main (String args) (new Box 1 () ؛ new Box 2 () ؛)) Swing 5 هذا المثال ينشئ نافذتين. يقوم أحدهما بتنفيذ تخطيط الكتلة على طول المحور Y ، والآخر - تخطيط الكتلة على طول المحور X.

إرسال عملك الجيد في قاعدة المعرفة أمر بسيط. استخدم النموذج أدناه

سيكون الطلاب وطلاب الدراسات العليا والعلماء الشباب الذين يستخدمون قاعدة المعرفة في دراساتهم وعملهم ممتنين جدًا لك.

نشر على http://www.allbest.ru/

المقدمة

على مدى السنوات القليلة الماضية ، بذل المطورون الكثير من الجهد لدمج الرسومات والرسوم المتحركة في تطبيقاتهم الصغيرة وتطبيقات Java. باستخدام واجهات برمجة التطبيقات java.awt و javax.swing ، يمكن للمطورين تنفيذ تطبيقات رسومية أكثر تعقيدًا ، بما في ذلك الألعاب ، وحافظات الشاشة ، وحافظات الشاشة ، وواجهات المستخدم الرسومية ثلاثية الأبعاد.

الغرض من العمل: تم تخصيص أعمال الحساب والرسوم البيانية لبناء التطبيقات باستخدام الواجهة الرسومية لمكتبتي java.awt و javax.swing.

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

1. صياغة المشكلة

واجهة المستخدم الرسومية (GUI) هي الطريقة الرئيسية التي يتفاعل بها المستخدمون النهائيون مع تطبيق جافا. لتطوير برامج التطبيقات بلغة Java ، أو بالأحرى الواجهة الرسومية للتطبيقات ، يتم استخدام حزم AWT و Swing عادةً.

AWT (يتم تنزيل حزمة java.awt للوصول) تحتوي على مجموعة من الفئات التي تسمح لك بإجراء عمليات رسومية وإنشاء عناصر تحكم في النافذة ، على غرار الطريقة التي يتم بها ذلك في VBA و Delphi ؛

يحتوي Swing (يتم تحميل حزمة javax.swing للوصول) على فئات جديدة ، تشبه في الغالب AWT. تمت إضافة J إلى أسماء الفئات (JButton ، JLabel ، إلخ).

في الوقت الحالي ، يتم تضمين الفئات الرئيسية لبناء واجهات مرئية في حزمة Swing. من حزمة AWT ، تُستخدم الفئات لمعالجة الرسائل. أبسط تطبيق رسومي مبين أدناه.

استيراد جافاكس. تأرجح.*؛

فئة العام النهائي HelloWorld تنفذ Runnable (

الرئيسية العامة الثابتة الفراغ (سلاسل السلسلة) (

// سوينغ لها موضوع الإرسال الخاص بها ،

// الذي يعمل بالتوازي مع الرئيسي (حيث يتم تنفيذ main ())

//مجرى. إذا انتهى الخيط الرئيسي من العمل (تنتهي الطريقة الرئيسية) ،

// يمكن للخيط المسؤول عن تشغيل واجهة Swing أن يواصل عمله.

// وحتى إذا قام المستخدم بإغلاق جميع النوافذ ، فسيواصل البرنامج عمله

// (طالما أن هذا الخيط على قيد الحياة). منذ جافا 6 عندما يكون كل شيء

// يتم تدمير المكونات ، ويتوقف تدفق التحكم تلقائيًا.

// قم بتشغيل كل التعليمات البرمجية التي تعمل على مؤشر ترابط التحكم ، حتى التهيئة:

SwingUtilities.invokeLater (جديد HelloWorld ()) ؛

تشغيل الفراغ العام () (

// أنشئ نافذة بعنوان "Hello، World!"

Frame f = new JFrame ("Hello، World!")؛

// كانت الممارسة السابقة هي إنشاء مستمع والتسجيل

// في مثيل النافذة الرئيسية التي استجابت لـ windowClosing ()

// إجبارًا على إيقاف تشغيل الجهاز الظاهري عن طريق استدعاء System.exit ()

// الآن هناك طريقة أكثر "صحيحة" لضبط رد الفعل على إغلاق النافذة.

// هذه الطريقة تدمر النافذة الحالية ، لكنها لا توقف التطبيق. تيم

// سيتم تشغيل التطبيق نفسه حتى يتم إغلاق جميع النوافذ.

f.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE) ،

// ومع ذلك ، يمكنك أيضًا تعيينه على النحو التالي:

// f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE) ،

// أضف مكونًا غير قابل للتحرير بنص إلى لوحة النافذة.

// f.getContentPane (). add (new JLabel ("Hello، World!"))؛ - موضة قديمة

f.add (جديد JLabel ("Hello World")) ؛

// pack () "تحزم" النافذة بالحجم الأمثل

// جميع المكونات الموجودة فيه.

// فرجي شباك

f.setVisible (صواب) ؛

يوفر Swing آليات للتحكم في الجوانب التالية من العرض التقديمي:

لوحة المفاتيح (يوفر التأرجح طريقة لاعتراض إدخال المستخدم)

الألوان (يوفر التأرجح طريقة لتغيير الألوان التي تراها على الشاشة)

حقل نصي للإدخال (يوفر Swing مكونات نصية للتعامل مع جميع المهام اليومية).

JComponent

الفئة الأساسية لمكتبة المكونات المرئية Swing بأكملها هي JComponent. إنها فئة فائقة من المكونات المرئية الأخرى. إنها فئة مجردة ، لذلك لا يمكنك حقًا إنشاء JComponent ، لكنها تحتوي على مئات الوظائف التي يمكن لكل مكون من مكونات Swing استخدامها كنتيجة لتسلسل الفئة. توفر فئة JComponent البنية الأساسية للتلوين لجميع المكونات ، وهي تعرف كيفية التعامل مع جميع ضغطات المفاتيح على لوحة المفاتيح ، وبالتالي لا تحتاج الفئات الفرعية إلا للاستماع إلى مفاتيح محددة. تحتوي فئة JComponent أيضًا على طريقة add () التي تسمح لك بإضافة كائنات أخرى من فئة JComponent ، بحيث يمكنك إضافة أي مكون Swing إلى أي مكون آخر لإنشاء مكونات متداخلة (على سبيل المثال ، JPanel يحتوي على JButton ، أو حتى مجموعات مربو الحيوانات ، مثل JMenu الذي يحتوي على JButton).

JLabel

أبسط وفي نفس الوقت المكون المرئي الرئيسي في مكتبة Swing هو JLabel أو "التسمية". تتضمن طرق هذه الفئة تعيين النص والصورة والمحاذاة والمكونات الأخرى التي يصفها الملصق:

get / setText () - الحصول على / تعيين النص في الملصق ؛

get / setIcon () - الحصول على / تعيين الرمز في الملصق ؛

الحصول على / setHorizontalAlignment - الحصول على / تعيين الوضع الأفقي للنص ؛

get / setDisplayedMnemonic () - الحصول على / تعيين ذاكري (حرف تحته خط) للملصق ؛

get / setLabelFor () - الحصول على / تعيين المكون الذي ترتبط به هذه التسمية ؛ عندما يضغط المستخدم على مجموعة المفاتيح Alt + ذاكري ، ينتقل التركيز إلى المكون المحدد.

jButton

العنصر النشط الرئيسي في Swing هو Jbutton.

تشبه الطرق المستخدمة لتغيير خصائص JButton تلك الخاصة بـ JLabel (ستجد أنها مماثلة لمعظم مكونات Swing). يتحكمون في النص والصور والاتجاه:

get / setText () - الحصول على / تعيين النص في الزر ؛

الحصول على / setIcon () - الحصول على / تعيين الصورة في الزر ؛

get / setHorizontalAlignment () - الحصول على / ضبط الوضع الأفقي للنص ؛

get / setVerticalAlignment () - الحصول على / تعيين الوضع الرأسي للنص ؛

get / setDisplayedMnenomic () - الحصول على / تعيين ذاكري (حرف تحته خط) يؤدي ، إلى جانب زر Alt ، إلى النقر فوق الزر.

jFrame

فئة JFrame عبارة عن حاوية تسمح لك بإضافة مكونات أخرى لنفسها لتنظيمها وتقديمها للمستخدم.

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

get / setTitle () - الحصول على / تعيين عنوان الإطار ؛

get / setState () - الحصول على / ضبط حالة الإطار (تصغير ، تكبير ، إلخ) ؛

is / setVisible () - الحصول على / ضبط رؤية الإطار ، بمعنى آخر ، العرض على الشاشة ؛

get / setLocation () - الحصول على / تعيين الموقع في النافذة حيث يجب أن يظهر الإطار ؛

get / setSize () - الحصول على / ضبط حجم الإطار ؛

add () - إضافة مكونات إلى الإطار.

المخططات والنماذج والأحداث

عند إنشاء تطبيقات مرئية في Java ، لا يمكنك وضعها بشكل عشوائي على الشاشة وتوقع أن تعمل على الفور. يجب وضع المكونات في مواقع محددة ، والتفاعل مع التفاعلات معها ، وتحديثها بناءً على هذا التفاعل ، وتعبئتها بالبيانات. للعمل بفعالية مع المكونات المرئية ، يجب تثبيت المكونات المعمارية الثلاثة التالية.

مخططات (تخطيط). يحتوي Swing على العديد من المخططات ، وهي فئات تتحكم في مكان وضع المكونات في التطبيق وما يجب أن يحدث لها عند تغيير حجم نافذة التطبيق أو عند إزالة المكونات أو إضافتها.

الأحداث يجب أن يستجيب البرنامج لضغطات المفاتيح ونقرات الماوس وكل شيء آخر يمكن للمستخدم القيام به.

النماذج (نموذج). بالنسبة للمكونات الأكثر تقدمًا (القوائم والجداول والأشجار) وحتى بعض المكونات الأبسط مثل JComboBox ، تعد النماذج هي الطريقة الأكثر فاعلية للعمل مع البيانات. يقومون بإزالة الكثير من أعمال معالجة البيانات من المكون نفسه (فكر في MVC) ويوفرون غلافًا حول فئات كائنات البيانات الشائعة (مثل Vector و ArrayList).

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

المهمة الفردية للحساب وعمل الرسم: ارسم في نافذة التطبيق مقطعًا يدور في مستوى الإطار حول نقطة تتحرك على طول المقطع.

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

2. تنفيذ مشكلة بلغة عالية المستوىجافا

استيراد java.awt. * ؛

استيراد java.awt.geom. * ؛

استيراد java.awt.image.BufferedImage ؛

* مهمة 4. تصويرفي نافذة او شباك التطبيقات (صغير) الجزء, لففي

* طائرة الإطار حول نقاط متحرك تشغيل قطعة.

توسع الفئة العامة LB4 java.applet.Applet تنفذ Runnable (

ثابت خاص طويل الإصدار التسلسلي= 1 لتر ؛

int الخاص w ، h ؛

خاص BufferedImage bi ؛

Graphics2D خاص كبير ؛

توقف منطقي خاص = خطأ ؛

مؤقت مؤشر الترابط الخاص = فارغ ؛

اللون الخاص fonColor = اللون. أبيض;

مقطع اللون الخاص: Color = Color. رمادي فاتح;

نقطة اللون الخاصة = اللون. لون أخضر;

قطعة خاصة

// مبدئي موقعك رسم

طول مزدوج خاص ؛

// اتجاه تحيز المحاور دوران

نقرة مزدوجة خاصة = -1 ؛

مناوبة مزدوجة خاصة = 0 ؛

نقطة السرعة المزدوجة الخاصة = 1 ؛

// سرعة التغييرات الأحكامفي الفراغ

سرعة int الخاصة إعادة الرسم = 30 ؛

// ركن تشغيل أيّ يحدث التغييرات الأحكام قطعة

الخاص int غراد = 15 ؛

/** هذه طريقة سوف يكون اتصل بعد، بعدما التحميلات صغير */

صيغة عامة باطلة () (

// نخلق أشياءو تثبيت مبدئي القيم.

البعد خافت = getSize () ؛

// نخلققطعة، يسأل الطول

lengthSegment = (مزدوج) Math. دقيقة(ث ، ح) / 3 ؛

المقطع = جزء جديد (lengthSegment ، lengthSegment / 2 ، grad ،

الجزءاللون ، نقطة اللون ، fonColor) ؛

bi = (BufferedImage) createImage (w، h)؛

كبير = bi.createGraphics () ،

big.setRenderingHint (RenderingHints. مفتاحي,

تقديم تلميحات. VALUE_ANTIALIAS_ON);

// نخلق تدفق, أيّ سوف يكون دوريا مكالمة طريقةتحديث.

الموقت = موضوع جديد (هذا) ؛

) catch (استثناء هـ) (

نظام. خارج.println (هـ) ؛

) // نهاية فيه

// هذه طريقة ينفذ إعادة الرسم نافذة او شباك صغير

تحديث الفراغ العام (الرسومات ز) (

// نحن نحصل المؤشر تشغيل شيءرسومات 2D

Graphics2D g2 = (Graphics2D) ز ؛

// نرسم تم الانتهاء من صورة تشغيل شاشة

g2.drawImage (bi ، 0 ، 0 ، هذا) ؛

) catch (خطأ استثناء) (

نظام. خارج.println (error.getMessage ()) ،

جزء الفراغ الخاص () (

* //تطهير صورة big.setBackground (Color.BLUE) ، big.clearRect (0 ، 0 ،

// نرسم الجزء

التحول + = movePoint * speedPoint ؛

إذا (التحول< -lengthSegment / 2) {

MovePoint * = -1 ؛

التحول =-lengthSegment / 2 ؛

) وإلا إذا (shift> lengthSegment / 2) (

MovePoint * = -1 ؛

التحول = lengthSegment / 2 ؛

section.setPos (التحول ، سبيدبوينت) ؛

الجزء. الدوران () ؛

big.drawImage (section.getSegment () ، فارغة ، 0 ، 0) ؛

// هذه طريقة إجراءفي متفرق مجرى(مؤقت).

// هو الأسباب إعادة الرسم نافذة او شباك صغير كل اعطني ثانية.

تشغيل الفراغ العام () (

مسلك. الموضوع الحالي();

مسلك. نايم(سرعة إعادة الرسم) ؛

) catch (استثناء خطأ) (

// هذه طريقة إجراء إذا المستعمل اليسار صفحة

// مع صغير. هو توقف تدفق(مؤقت) و ، على التوالى,

// إعادة الرسم نافذة او شباكصغير.

توقف عام باطل () (

// يتم تنفيذ هذه الطريقة عندما يهبط المستخدم على الصفحة

// مع التطبيق الصغير. يبدأ خيطًا متوازيًا (مؤقت).

بداية الفراغ العام () (

إذا (مؤقت == فارغة) (

الموقت = موضوع جديد (هذا) ؛

// يتم تنفيذ هذه الطريقة عند إغلاق الصفحة التي تحتوي على التطبيق الصغير.

تدمير الفراغ العام () (

super.destroy () ؛

مسلك. الموضوع الحالي();

// انتظر حتى ينتهي الخيط المتوازي (المؤقت).

مسلك. أَثْمَر();

) // نهاية التدمير

) // إنهاء الطبقة العامة RotatingSegment

// إنشاء شريحة

مزدوج ثابت خاص x = 0;

نهائي مزدوج RAD = 10 ؛

طول مزدوج خاص

مقطع BufferedImage الخاص ؛

الألوان الخاصة

نقطة اللون الخاصة

لون خاص backGroundColor ؛

مستطيل خاص 2D. مزدوج ص ؛

Ellipse2D الخاص. p مزدوج ؛

دوران مزدوج خاص

خاص Point2D. مركز مزدوج ؛

مناوبة مزدوجة خاصة

// الزاوية التي يتغير بها موضع المقطع

intgrad الخاص

قطعة (طول مزدوج ، نقطة بيع مزدوجة ، تدوير ، int غراد ،

مقطع اللون: اللون ، نقطة اللون ، اللون ، اللون الخلفي للأرض ، اللون)

رميات استثناء (

// تحقق من المعلمات

إذا (الطول<= 0 || posPointRotating < 0 || length < posPointRotating)

رمي استثناء جديد (

"خطأ: معلمة غير صالحة في فئة المقطع") ؛

this.grad = grad؛

this.segmentColor = sectionColor ؛

this.pointColor = pointColor ؛

this.backGroundColor = backGroundColor ؛

this.length = الطول ؛

// إنشاء الرسم

المقطع = جديد BufferedImage ((int) length * 3، (int) length * 3،

صورة مخزنة. TYPE_INT_ARGB);

المركز = نقطة جديدة ثنائية الأبعاد (الطول ، 3 * الطول / 2) ؛

// إنشاء شريحة

rotationAxis = center.x + posPointRotating - RAD / 2 ؛

p = جديد Ellipse2D.Double (محور دوران ، center.y ، RAD ، RAD) ؛

// ضبط لون المقطع

g2.setColor (sectionColor) ؛

// ارسم قطعة

// تعيين لون النقطة

g2.setColor (pointColor) ؛

// ارسم نقطة

// يغير النقطة المحورية

مجموعة باطلة عامة

// إنشاء شريحة

this.shift = shiftX ؛

center.y = center.y + shiftY * الرياضيات. الخطيئة(رياضيات. للراديان(غراد * x));

r = جديد Rectangle2D.Double (center.x، center.y، length، RAD) ؛

p = جديد Ellipse2D.Double (محور دوران + تحول ، center.y ، RAD ، RAD) ؛

// يدور الجزء

تدوير الفراغ العام () (

AffineTransform في = AffineTransform. getRotateInstance(

رياضيات. للراديان(غراد * (++ x)) ، دوران المحور + RAD / 2 + تحول ،

// الحصول على سياق الرسومات

Graphics2D g2 = section.createGraphics () ،

// ارسم كل شيء باللون المحدد

g2.setBackground (backGroundColor) ؛

g2.clearRect (0 ، 0 ، (int) (3 * length) ، (int) (3 * length)) ؛

g2.setTransform (في) ؛

g2.setColor (sectionColor) ؛

// ارسم قطعة

// تعيين لون النقطة

g2.setColor (pointColor) ؛

// ارسم نقطة

// يعيد صورة

عامة BufferedImage getSegment () (

3. مثال على تشغيل البرنامج

نتيجة تنفيذ البرنامج:

الشكل 1. نتيجة تنفيذ البرنامج

الشكل 2. نتيجة تنفيذ البرنامج

الشكل 3. نتيجة تنفيذ البرنامج

استنتاج

بهذا نختتم مناقشتنا للرسومات في جافا. في هذه الورقة ، قدمنا ​​لمحة موجزة عن أدوات برمجة الرسومات ثنائية الأبعاد في Java. لقد قدمنا ​​تطبيقًا يوضح استخدام الأشكال والقوام الهندسي.

لقد ناقشنا بعض الميزات الرسومية لجافا. بدأنا بمقدمة موجزة لأساسيات الرسومات ، مثل أنظمة الإحداثيات وسياقات الرسومات. ثم ناقشنا مرافق Java 2D. قمنا أيضًا بتغطية كيفية استخدام التأثيرات الرسومية بإيجاز.

النصف الثاني من مقدمتنا للبرمجة الرسومية في Java. باستخدام الواجهة الرسومية لمكتبتي java.awt و javax.swing ، قمنا بإنشاء محرر رسومي بسيط يقوم بتدوير كائن ثنائي الأبعاد حول محوره.

فهرس

1. H. M. Deitel، P.J. Deitel، S.I. Suntry - Java Programming Technologies ، الكتاب الأول (الرسومات ، JAVABEANS ، واجهة المستخدم)

2. جودي بيشوب - يعمل جافا بكفاءة

3. جيمس جوسلينج ، بيل جوي ، جاي ستيل ، جلعاد براشا - مواصفات لغة جافا ، الإصدار الثاني.

4. تيم ليندهولم ، فرانك يلين - مواصفات آلة جافا الافتراضية ، الإصدار الثاني.

5. Gosling J.، Arnold K. - لغة برمجة جافا

6. معلومات من www.ibm.com

7. معلومات من موقع www.mexmat.sgu.ru

8. معلومات من موقع www.uic.rsu.ru

استضافت على Allbest.ru

...

وثائق مماثلة

    هيكل تنظيم واجهة المستخدم الرسومية ، وإعلان وإنشاء مستمعين للأحداث باستخدام فئات مجهولة. تمثيل البيانات للجدول هو فئة AbstractTableModel. تصور خلايا الجدول. النوعان الرئيسيان من تدفقات الإدخال / الإخراج في Java.

    محاضرة ، أضيفت في 05/01/2014

    تطوير محرر رسومات لرسم رسومات ثنائية وثلاثية الأبعاد باستخدام لغة برمجة Java وواجهات برمجة تطبيقات Java 2D و Java 3D. إنشاء محرر رسومات 3D Paint. الطرق الرئيسية لفئة الرسوميات.

    ورقة مصطلح ، تمت الإضافة في 11/19/2009

    وصف حزمة تطبيق Net Beans 8.1. تطوير واجهة مستخدم التطبيق الصغير. إنشاء إطارات إطارات بناءً على إطارات مكتبة java.swing. تغيير لون البيانات النصية. تصميم وإنشاء نموذج معلوماتي لتطبيق صغير.

    العمل الرقابي ، تمت إضافة 07/11/2016

    إمكانيات شبكة لغات البرمجة. فوائد استخدام تطبيقات Java الصغيرة. الفصول المدرجة في مكتبة java.awt. إنشاء واجهة المستخدم. اتصال مأخذ توصيل إلى الخادم. الرسومات في جافا. قيم مكونات اللون.

    ورقة مصطلح ، تمت إضافة 11/10/2014

    فئات مؤسسة جافا ، المفاهيم الأساسية. التسلسل الهرمي لفئة مجموعة أدوات النافذة المجردة الأصلية. ممثلي واجهة المستخدم. معالجة الأحداث في JavaBeans. الضوابط ، حقل JText متعدد الأسطر. إدراج برنامج TextEditor.

    ورقة مصطلح ، تمت الإضافة 06/26/2013

    تنفيذ برنامج جافا. مجموعة من برامج وفصول JDK. البرمجة الشيئية في جافا. مبادئ بناء واجهة رسومية. مكون وحاوية لنظام الرسومات. التطبيقات الصغيرة هي برامج تعمل في بيئة المتصفح.

    ورقة مصطلح تمت إضافتها في 02/08/2011

    جدولة وظيفة الرسم التخطيطي لتطبيق وحدة التحكم. الفرق بين تطبيق وحدة التحكم والتطبيق وواجهة المستخدم الرسومية. مخطط الفصل لـ JFrame و JPanel. إنشاء إطار بسيط في Java. تخطيط عناصر الواجهة داخل الإطار. حلقة الحدث.

    محاضرة ، أضيفت في 05/01/2014

    المفهوم والخصائص العامة للغة برمجة PHP ومبادئ ومراحل عملها والنحو والمصفوفات المرتبطة بها. معالجة الاستثناءات في Java. العمل مع قواعد البيانات باستخدام JDBC. تعلم كيفية تطوير واجهة رسومية.

    عرض تقديمي ، تمت إضافة 06/13/2014

    تطوير مخطط منطقي لقاعدة بيانات لمؤسسة تصنيع سيارات. نمذجة نظام المعلومات. إنشاء واجهة مستخدم رسومية لقاعدة البيانات باستخدام لغة برمجة Java. اختبار البرمجيات.

    ورقة مصطلح ، تمت إضافتها في 12/16/2013

    إنشاء تطبيقات وحدة التحكم باستخدام واجهة المستخدم الرسومية. محتويات لوحة مكونات برنامج C ++ Builder. استخدام إمكانيات البرمجة الشيئية وميزات محرر الكود والنماذج في C ++.

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

يعد الوضع مع إطارات واجهة المستخدم الرسومية في عالم Java مربكًا إلى حد ما. بقدر ما استطعت اكتشاف الأمور كما يلي.

  • أ.(مجموعة أدوات النافذة المجردة) كان أول إطار عمل لواجهة المستخدم الرسومية. كانت الفكرة صحيحة - تستخدم AWT عناصر تحكم أصلية ، أي أنها تبدو أصلية ماديًا ، بغض النظر عن مكان تشغيل التطبيق الخاص بك. لسوء الحظ ، اتضح أن (1) هناك عدد قليل من عناصر التحكم المشتركة في البيئات المختلفة و (2) من الصعب جدًا كتابة واجهات أصلية عبر الأنظمة الأساسية بحيث لا يزحف أي شيء ولا يتشتت ؛
  • لذلك ، تم استبدال AWT بـ تأرجح. تستخدم Swing القوالب التي أنشأتها AWT والتي ترسم عليها عناصر التحكم من تلقاء نفسها. يعمل هذا الاقتصاد ، بالطبع ، بشكل أبطأ ، لكن واجهة المستخدم تصبح أكثر قابلية للنقل. يقدم Swing للمبرمج مجموعة متنوعة من Look & Feels للاختيار من بينها ، وبفضل ذلك يمكنك إما جعل مظهر التطبيق وتصرفتنفس الشيء لكل من Windows و Linux ، أو أن يكون التطبيق مشابهًا جدًا للتطبيق الأصلي ، بغض النظر عن مكان تشغيله. في الحالة الأولى ، يكون التطبيق أسهل في التصحيح ، وفي الحالة الثانية ، يصبح المستخدمون أكثر سعادة. بالمناسبة ، تم صنع Swing في الأصل بواسطة الرجال في Netscape ؛
  • SWT(Standard Widget Toolkit) هو إطار عمل مكتوب بواسطة IBM ويستخدم في Eclipse. كما هو الحال في AWT ، يتم استخدام عناصر التحكم الأصلية. SWT ليست جزءًا من JDK وتستخدم JNI ، لذلك فهي لا تتناسب حقًا مع أيديولوجية Java "الكتابة مرة واحدة ، تشغيل في كل مكان". يبدو أنه برغبة قوية للغاية ، يمكنك تجميع تطبيق SWT لجميع الأنظمة الأساسية في حزمة ، ومن ثم يبدو أن التطبيق أصبح محمولًا ، ولكن فقط حتى يظهر نظام تشغيل جديد أو بنية معالج جديدة ؛
  • JavaFXتم نشرها بنشاط في Oracle وتم وضعها كبديل لسيارة الإسعاف لـ Swing. من الناحية الأيديولوجية ، فإن JavaFX تشبه Swing ، أي أن عناصر التحكم ليست أصلية. تشمل الميزات المثيرة للاهتمام في JavaFX تسريع الأجهزة ، وإنشاء واجهة المستخدم الرسومية باستخدام CSS و XML (FXML) ، والقدرة على استخدام عناصر تحكم JavaFX في Swing ، بالإضافة إلى مجموعة من عناصر التحكم الجميلة الجديدة ، بما في ذلك تلك الخاصة برسم الرسوم البيانية والأبعاد الثلاثية. يتوفر مقطع فيديو مع نظرة عامة أكثر تفصيلاً عن JavaFX. منذ Java 7 ، أصبح JavaFX جزءًا من JRE / JDK ؛
  • منصة NetBeans(لا ينبغي الخلط بينه وبين NetBeans IDE!) - هذا شيء ، كما أفهمه ، يعمل فوق Swing و JavaFX ، ويوفر واجهة أكثر ملاءمة للعمل معهم ، بالإضافة إلى جميع أنواع عناصر التحكم الإضافية. في أحد التطبيقات التي تستخدم NetBeans Platform ، رأيت القدرة على سحب وإسقاط علامات التبويب باستخدام المخدرات والإفلات ، ووضع اللوحات في النافذة على غرار ما يفعله مديرو النوافذ المكسوة بالبلاط. على ما يبدو ، لا تستطيع Swing نفسها فعل ذلك. اقرأ المزيد حول منصة NetBeans ؛

من الممكن أن تكون هناك أطر أخرى. يعتبر Swing أكثر المعايير المتعارف عليها اليوم ، لذا سنتعامل معه.

أعلاه ، قيل شيء ما عن بعض Look & Feel هناك. لفهم ما هو على المحك بشكل أفضل ، دعنا نكتب برنامجًا يعرض قائمة من نفس الشكل والمظهر ويسمح لك بالتبديل بينهما في عملية تشغيل البرنامج.

سيبدو تطبيقنا بهذا الشكل تحت Ubuntu:

وهذا ما سيبدو عليه عند التشغيل تحت Windows:

كما ترى ، تتضمن JREs لنظامي التشغيل Windows و Linux مجموعة مختلفة من L & Fs. بالإضافة إلى ذلك ، يمكنك توصيل مظهر ومظهر طرف ثالث أو حتى كتابة ما تريده. بشكل افتراضي ، يتم استخدام L&F Metal ، والتي تبدو متشابهة إلى حد ما في جميع أنظمة التشغيل ومديري النوافذ. إذا كنت تفضل الأزرار الدائرية ، فيمكنك استخدام Look & Feel Nimbus بدلاً من Metal. إذا كنت تريد أن يبدو التطبيق وكأنه تطبيق أصلي ، فيجب عليك في نظام Linux اختيار L&F GTK + (أتساءل عما إذا كان المستخدم يقوم بتشغيل KDE؟) ، وضمن Windows - L&F Windows. قد تكون فكرة جيدة أن تجعل برنامجك ينتقل بين L & Fs المختلفة. من ناحية أخرى ، سيكون عليك اختبار التطبيق باستخدام كل L & Fs.

لنلقِ نظرة على الكود المصدري للتطبيق. أكد لي زملائي المتخصصين في UI أنهم لا يستخدمون أي من محرري WYSIWYG ، وإذا فعلوا ذلك ، فهذا فقط للنماذج الأولية السريعة. من بين محرري WYSIWYG الجيدين ، كان الاسم هو JFormDesigner. يقولون أن الكود الذي يولده يبدو حتى وكأنه كود مكتوب بشريًا ، وليس جهنميًا (). التسلسل (). calls (). methods (). بشكل عام ، تمت كتابة جميع الكود باستخدام الكفوف في IntelliJ IDEA.

الرئيسية العامة الثابتة الفراغ (سلاسل السلسلة) (

@تجاوز
تشغيل الفراغ العام () (
إنشاء واجهة المستخدم الرسومية () ؛
}
} ) ;
}

في Swing و AWT ، إذا أردنا تغيير شيء ما في واجهة المستخدم ، فعلينا القيام بذلك من سلسلة إرسال الحدث. تأخذ طريقة invokeLater الثابتة فئة تنفذ واجهة Runnable وتستدعي طريقة run () الخاصة بها داخل مؤشر ترابط إرسال الحدث. إذا لم تكن معتادًا على بناء الجملة أعلاه ، فهذه هي طريقة Java لإعلان فئة دون إعطائها اسمًا. تسمى الفئات التي ليس لها اسم مجهول. غالبًا ما تؤدي الفصول المجهولة في Java نفس الدور الذي تلعبه وظائف lambda في لغات البرمجة الوظيفية. من بين أمور أخرى ، يتم دعم عمليات الإغلاق أيضًا. من المثير للاهتمام ، على عكس lambdas ، أن الفصول المجهولة في Java تسمح لك بتمرير مجموعة من الطرق في وقت واحد. علاوة على ذلك ، بمساعدة فئات الوراثة والمجردة ، لجميع الطرق أو جزء منها ، يمكنك أن تأخذ تنفيذها الافتراضي.

يتحقق التعليق التوضيحيOverride من أن طريقة run () ستتجاوز بالفعل طريقة واجهة التشغيل. بدونها ، عند تجاوز إحدى الطرق ، قد نقوم بالخطأ بخطأ إملائي ونحدد طريقة جديدة بدلاً من تجاوز طريقة موجودة. ومع ذلك ، في هذه الحالة بالذات ، فإن التعليق التوضيحي ، على ما يبدو ، ليس مفيدًا جدًا ، وربما يكون غير ضروري.

نتيجة لذلك ، سوف يستدعي مؤشر ترابط إرسال الحدث طريقة createGUI () ، وكودها الكامل على النحو التالي:

إنشاء الفراغ الثابت الخاص GUI () (
جيليست< String>list = new JList<> () ;
list.setSelectionMode (ListSelectionModel .SINGLE_SELECTION) ،

JScrollPane listScrollPane = new JScrollPane (list)؛

JPanel topPanel = new JPanel () ؛
topPanel.setLayout (new BorderLayout ()) ؛
topPanel.add (listScrollPane، BorderLayout .CENTER) ؛

ActionListener updateButtonListener = new UpdateListAction (list)؛
تم إجراء updateButtonListener.action (
حدث ActionEvent الجديد (list، ActionEvent .ACTION_PERFORMED، null)
) ;

JButton updateListButton = جديد JButton ("قائمة التحديث") ؛
JButton updateLookAndFeelButton = جديد JButton ("تحديث الشكل والمظهر") ؛

JPanel btnPanel = new JPanel () ؛
btnPannel.setLayout (جديد BoxLayout (btnPannel ، BoxLayout .LINE_AXIS)) ؛
btnPannel.add (updateListButton) ،
btnPannel.add (Box .createHorizontalStrut (5)) ؛
btnPannel.add (updateLookAndFeelButton) ،

JPanel bottomPanel = new JPanel () ؛
bottomPanel.add (btnPanel) ؛

لوحة JPanel = new JPanel () ؛
panel.setBorder (BorderFactory .createEmptyBorder (5، 5، 5، 5)) ؛
panel.setLayout (new BorderLayout ()) ؛
panel.add (topPanel، BorderLayout .CENTER) ؛
panel.add (bottomPanel، BorderLayout .SOUTH) ؛

إطار JFrame = إطار JFrame جديد ("أداة تبديل المظهر والمظهر") ؛
frame.setMinimumSize (أبعاد جديدة (300 ، 200)) ؛
frame.setDefaultCloseOperation (WindowConstants .EXIT_ON_CLOSE) ،
frame.add (لوحة) ؛
الإطار. حزمة () ؛
frame.setVisible (صحيح) ؛

UpdateListButton.addActionListener (updateButtonListener) ،
updateLookAndFeelButton.addActionListener (
UpdateLookAndFeelAction جديد (إطار ، قائمة)
) ;
}

هنا ، بشكل عام ، لا يوجد شيء معقد للغاية. الأزرار ، يتم إنشاء قائمة ، يتم تغليف القائمة في JScrollPane بحيث يتم تمرير القائمة. يتم ترتيب عناصر التحكم في إطار باستخدام اللوحات. يمكن أن يكون للوحات تخطيطات مختلفة ، استخدمنا هنا BorderLayout و BoxLayout. المبدأ مشابه للمبدأ المستخدم في wxWidgets.

للرد على الأحداث المختلفة ، مثل الضغط على الأزرار ، يتم استخدام الفئات التي تنفذ واجهة ActionListener. يستخدم الكود أعلاه فئتين من هذه الفئات ، UpdateListAction و UpdateLookAndFeelAction. كما قد تتخيل من الاسم ، فإن الفئة الأولى مسؤولة عن معالجة النقرات على الزر الأيسر "قائمة التحديث" ، والثانية - على الزر الأيمن "تحديث الشكل والمظهر". يتم إرفاق ActionListeners بالأزرار باستخدام طريقة addActionListener. نظرًا لأننا نريد أن نرى قائمة Look & Feels المتاحة بعد بدء التطبيق مباشرة ، فإننا نحاكي النقر على زر "قائمة التحديث". للقيام بذلك ، نقوم بإنشاء مثيل لفئة ActionEvent وتمريرها كوسيطة للطريقة actionPerformed للفئة UpdateListAction.

يتم تنفيذ فئة UpdateListAction كالتالي:

فئة ثابتة UpdateListAction تنفذ ActionListener (
JList الخاص< String>قائمة؛

UpdateListAction العامة (JList< String>قائمة) (
this.list = قائمة ؛
}

@تجاوز
إجراء الفراغ العام
ArrayList< String>lookAndFeelList = قائمة صفيف جديدة<> () ;
UIManager.LookAndFeelInfo infoArray =

int lookAndFeelIndex = 0 ؛
int currentLookAndFeelIndex = 0 ،
سلسلة CurrentLookAndFeelClassName =
UIManager .getLookAndFeel () .getClass () .getName () ،

إلى عن على ( UIManager.LookAndFeelInfoمعلومات: infoArray) (
إذا كان (info.getClassName () .equals (currentLookAndFeelClassName)) (
currentLookAndFeelIndex = lookAndFeelIndex ؛
}
lookAndFeelList.add (info.getName ()) ،
lookAndFeelIndex ++ ؛
}

String listDataArray = new String [lookAndFeelList.size ()]؛
السلسلة النهائية newListData =
lookAndFeelList.toArray (listDataArray) ،
final int newSelectedIndex = currentLookAndFeelIndex ؛

SwingUtilities .invokeLater (new Runnable () (
@تجاوز
تشغيل الفراغ العام () (
list.setListData (newListData) ،
list.setSelectedIndex (newSelectedIndex) ،
}
} ) ;
}
}

في المُنشئ ، يتم تمرير مؤشر إلى قائمة نعرض فيها الشكل والمظهر المتاحين. في الواقع ، نظرًا لأن UpdateListAction هي فئة متداخلة من فئة LookAndFeelSwitcher الرئيسية ، فهي تتمتع بالقدرة على الوصول مباشرة إلى حقول مثيل LookAndFeelSwitcher الذي أنشأها. لكن الموظف الذي بداخلي يقاوم هذا النهج ، لذلك قررت أن أمرر إشارة إلى القائمة صراحة من خلال المنشئ.

سيتم استدعاء طريقة actionPerformed عند النقر فوق الزر. رمز هذه الطريقة تافه تمامًا - فنحن ببساطة نستخدم الطرق الثابتة لفئة UIManager للحصول على قائمة بالمظهر والمظهر المتاحين ، وكذلك تحديد الشكل والمظهر الحاليين. ثم يتم تحديث محتويات القائمة والعنصر المحدد فيها. هنا تحتاج إلى الانتباه إلى نقطتين. أولاً ، كل مظهر وشعور به اسمو اسم الفصلأشياء مختلفة. يجب أن نظهر أسماء المستخدمين ، وعند التبديل بين الشكل والمظهر ، استخدم اسم الفئة. ثانيًا ، لاحظ كيف يتم إنشاء المتغيرين النهائيين newListData و newSelectedIndex ثم استخدامهما في الفئة المجهولة. هذا هو نفس التناظرية لعمليات الإغلاق ، والتي نوقشت سابقًا. من الواضح أن استخدام المتغيرات غير النهائية في عمليات الإغلاق سيؤدي إلى عواقب وخيمة.

أخيرًا ، ضع في اعتبارك فئة UpdateLookAndFeelAction:

يقوم UpdateLookAndFeelAction بفئة ثابتة بتنفيذ ActionListener (
JList الخاص< String>قائمة؛
إطار جذر JFrame الخاص ؛

UpdateLookAndFeelAction العام (إطار JFrame ، JList< String>قائمة) (
هذا .rootFrame = الإطار ؛
this.list = قائمة ؛
}

@تجاوز
إجراء الفراغ العام
String lookAndFeelName = list.getSelectedValue () ،
UIManager.LookAndFeelInfo infoArray =
UIManager .getInstalledLookAndFeels () ،

إلى عن على ( UIManager.LookAndFeelInfoمعلومات: infoArray) (
إذا كان (info.getName () .equals (lookAndFeelName)) (
String message = "تم تغيير الشكل والأسلوب إلى" + lookAndFeelName ؛
يحاول(
UIManager .setLookAndFeel (info.getClassName ()) ،
SwingUtilities .updateComponentTreeUI (rootFrame) ،
) catch (ClassNotFoundException e1) (
message = "خطأ:" + info.getClassName () + "غير موجود" ؛
) catch (InstantiationException e1) (
رسالة = "خطأ: استثناء إنشاء مثيل";
) catch (IllegalAccessException e1) (
message = "خطأ: وصول غير قانوني" ؛
) المصيد ( UnsupportedLookAndFeelExceptionه 1) (
رسالة = "خطأ: شكل وأسلوب غير مدعومين";
}
JOptionPane .showMessageDialog (خالية ، رسالة) ؛
فترة راحة ؛
}
}
}
}

هنا ببساطة (1) نجد L & F بنفس الاسم مثل الاسم المحدد في القائمة ، (2) قم بتغيير L & F باستخدام طريقة setLookAndFeel الثابتة لفئة UIManager ، و (3) إعادة رسم الإطار الرئيسي لواجهة المستخدم الخاصة بنا ، وكذلك بشكل متكرر ، العناصر الموجودة عليه ، باستخدام طريقة updateComponentTreeUI الثابتة لفئة SwingUtilities. أخيرًا ، نبلغ المستخدم برسالة ما إذا كان كل شيء ناجحًا.

أود أيضًا أن أقول بضع كلمات حول تصحيح أخطاء تطبيقات واجهة المستخدم الرسومية في Java ، وليس فقط واجهة المستخدم الرسومية. أولاً ، يحتوي Swing على اختصار لوحة المفاتيح السحري Ctr + Shift + F1 ، والذي يطبع إلى معلومات stdout حول كيفية وجود عناصر التحكم. مفيد جدًا إذا كنت تريد سرقة واجهة مستخدم منافسيك. ثانيًا ، يوجد مفتاح الاختصار Ctr + \. إذا قمت بالنقر فوقه في وحدة التحكم الخاصة بتطبيق Java قيد التشغيل ، فسيتم عرض جميع سلاسل الرسائل وتتبع المكدس الخاص بها. مناسب إذا وقعت في طريق مسدود. أخيرًا ، ثالثًا ، أثناء تطوير واجهة المستخدم الرسومية ، قد يكون من المفيد تزيين اللوحات بألوان مختلفة. يمكنك القيام بذلك على النحو التالي:

أزرارPanel.setBackground (اللون. أزرق) ؛

لقد مرت الواجهة الرسومية في Java بمسار شائك للغاية من التطوير والتكوين. لفترة طويلة اتهم بالعمل البطيء والجشع لموارد النظام والوظائف المحدودة.

جافا AWT

كانت أول محاولة لشركة Sun في استخدام واجهة المستخدم الرسومية لـ Java هي المكتبة أ.(مجموعة أدوات النافذة المجردة) - مجموعة أدوات للعمل مع بيئات النوافذ المختلفة. صنعت Sun طبقة Java تستدعي طرقًا من مكتبات مكتوبة في C. تقوم أساليب مكتبة AWT بإنشاء واستخدام المكونات الرسومية لبيئة التشغيل. من ناحية ، يعد هذا أمرًا جيدًا ، نظرًا لأن برنامج Java يشبه البرامج الأخرى داخل نفس نظام التشغيل. ولكن عند تشغيله على نظام أساسي مختلف ، فقد تكون هناك اختلافات في أحجام المكونات والخطوط التي من شأنها إفساد مظهر البرنامج.

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

لذا فإن المكونات أ.لا تفعل أي "عمل". إنها مجرد "غلاف Java" للتحكم في نظام التشغيل الذي تعمل عليه. يتم إعادة توجيه جميع الطلبات الخاصة بهذه المكونات إلى نظام التشغيل الذي يقوم بكل العمل.

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

مفاهيم SWING الأساسية

بعد، بعدما أ.طورت Sun مكتبة مكونة للرسومات تأرجح، مكتوبة بالكامل بلغة جافا. يتم استخدام 2D للتصيير ، والذي يجلب معه العديد من المزايا في وقت واحد. تتجاوز مجموعة المكونات القياسية AWT بكثير من حيث التنوع والوظائف. يجعل Swing من السهل إنشاء مكونات جديدة عن طريق التوريث من المكونات الموجودة ، ويدعم مجموعة متنوعة من الأنماط والجلود.

منشئو مكتبة واجهة المستخدم الجديدة تأرجحلم "يعيدوا اختراع العجلة" واختاروا AWT كأساس لمكتبتهم. بالطبع ، لم نتحدث عن استخدام مكونات AWT محددة الوزن الثقيل (ممثلة في Button و Label والفئات المماثلة). توفر المكونات خفيفة الوزن فقط الدرجة المطلوبة من المرونة وإمكانية التحكم. يوضح مخطط الوراثة العلاقة بين AWT و Swing.

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

حاويات سوينغ ذات المستوى الأعلى

لإنشاء واجهة رسومية لأحد التطبيقات ، تحتاج إلى استخدام مكونات خاصة لمكتبة Swing ، تسمى حاويات المستوى الأعلى. إنها نوافذ نظام التشغيل التي تستضيف مكونات واجهة المستخدم. تتضمن حاويات المستوى الأعلى نوافذ JFrame و JWindow ، ومربع حوار JDialog ، وبرنامج JApplet الصغير (وهو ليس نافذة ، ولكنه مصمم أيضًا لعرض واجهة في المستعرض الذي يقوم بتشغيل هذا التطبيق الصغير). حاويات التأرجح عالية المستوى هي مكونات ثقيلة الوزن وهي استثناء من القاعدة العامة. جميع مكونات التأرجح الأخرى خفيفة الوزن.

بسيط تأرجحمثال على واجهة النافذة jFrame.

استيراد java.awt.Dimension ؛ استيراد javax.swing.JFrame ؛ استيراد javax.swing.JLabel ؛ فئة عامة JFrameTest (عامة ثابتة باطلة createGUI () (JFrame frame = new JFrame ("Test frame")؛ frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)؛ JLabel label = new JLabel ("Test label")؛ frame.getContentPane (). add (label)؛ frame.setPreferredSize (new Dimension (200، 100))؛ frame.pack ()؛ frame.setVisible (true)؛) main static void main (String args) (JFrame.setDefaultLookAndFeelDecorated (true) ؛ javax. swing.SwingUtilities.invokeLater (جديد Runnable () (تشغيل الفراغ العام () (createGUI () ؛))) ؛))

البناء JFrame ()بدون معلمات يخلق نافذة فارغة. البناء JFrame (عنوان السلسلة)ينشئ نافذة فارغة بعنوان العنوان. لإنشاء برنامج بسيط بنافذة فارغة ، تحتاج إلى استخدام الطرق التالية:

  • setSize (عرض int ، ارتفاع int) - تحديد حجم النافذة ؛
  • setDefaultCloseOperation (عملية int) - تعريف الإجراء عند إنهاء البرنامج ؛
  • setVisible (قيمة منطقية مرئية) - اجعل النافذة مرئية.

إذا لم تحدد حجم النافذة ، فسيكون ارتفاعها صفريًا بغض النظر عما بداخلها. لا تشمل أبعاد النافذة منطقة "العمل" فحسب ، بل تشمل أيضًا الحدود وشريط العنوان.

تحدد طريقة setDefaultCloseOperation الإجراء الواجب اتخاذه عند "الخروج من البرنامج". للقيام بذلك ، قم بتمرير ثابت EXIT_ON_CLOSE ، الموضح في فئة JFrame ، كمعامل التشغيل.

بشكل افتراضي ، يتم إنشاء النافذة غير مرئية. لعرض النافذة على الشاشة ، يتم استدعاء طريقة setVisible بالمعامل true. إذا اتصلت بها باستخدام المعلمة false ، فستصبح النافذة غير مرئية.

واجهة المستخدم الرسومية جافا سوينغمثال على إنشاء النافذة jFrameهو مبين في الشكل التالي.

لتوصيل المكتبة تأرجحيحتاج التطبيق إلى استيراد المكتبة javax.swing.

في كل مرة يتم فيها إنشاء حاوية ذات مستوى أعلى ، سواء كانت نافذة عادية أو مربع حوار أو برنامج صغير ، ينشئ مُنشئ الحاوية لوحة جذر JRootPane. تتأكد حاويات التأرجح ذات المستوى الأعلى من أن المكونات الأخرى لا يمكنها "الزحف" خارج JRootPane.

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

يوضح الشكل التالي بوضوح بنية لوحة الجذر JRootPane.

لوحة الجذر JRootPaneعبارة عن حاوية ترث من فئة Swing JComponent الأساسية. في هذه الحاوية ، يكون مدير تخطيط خاص ، يتم تنفيذه في فئة RootPaneLayout الداخلية ، مسؤولاً عن تخطيط المكونات. مدير التخطيط هذا مسؤول عن ضمان وضع جميع الأجزاء المكونة للوحة الجذر كما ينبغي: تشغل اللوحة ذات الطبقات المساحة الكاملة للنافذة ؛ يحتوي FRAME_CONTENT_LAYER الخاص به على شريط القوائم ولوحة المحتوى ، وفوق كل ذلك توجد لوحة شفافة.

جميع مكونات لوحة الجذر JRootPaneيمكن الحصول عليها أو تغييرها. لديها مجموعة من طرق get / set لهذا الغرض. برمجيا JRootPaneيمكن الحصول عليها باستخدام طريقة getRootPane ().

بالإضافة إلى حاويات المستوى الأعلى ، يتم استخدام جزء الجذر في نوافذ JInternalFrame الداخلية التي تم إنشاؤها في تطبيقات المستندات المتعددة والموجودة على سطح المكتب JDesktopPane. يتيح لك هذا أن تنسى أن هذه النوافذ عبارة عن مكونات خفيفة الوزن عادية ، وتعمل معها كما لو كانت حاويات حقيقية من المستوى الأعلى.

لوحة الطبقات JLayeredPane

في قاعدة لوحة الجذر (الحاوية) يوجد ما يسمى باللوحة ذات الطبقات JLayeredPane A الذي يشغل كل المساحة المتوفرة في الحاوية. توجد في هذه اللوحة جميع الأجزاء الأخرى من لوحة الجذر ، بما في ذلك جميع مكونات واجهة المستخدم.

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

المكون الأول المضاف إلى الحاوية أعلى من المكونات المضافة لاحقًا. في أغلب الأحيان ، لا يتعامل المطور مع مواقف المكونات. عند إضافة مكونات ، يتغير موضعها تلقائيًا. ومع ذلك ، تسمح لك اللوحة ذات الطبقات بتغيير موضع المكونات ديناميكيًا ، بعد إضافتها إلى الحاوية.

تستخدم بعض المكونات قدرات اللوحة ذات الطبقات على نطاق واسع تأرجح. إنها مهمة بشكل خاص لتطبيقات المستندات المتعددة ، وتلميحات الأدوات والقوائم. متعدد الوثائق تأرجحتستخدم التطبيقات حاوية خاصة JDesktopPane("سطح المكتب") موروث من JLayeredPane A يحمل نوافذ متأرجحة داخلية. يتم توفير أهم وظائف تطبيق المستندات المتعددة - وضع النافذة "النشطة" فوق الآخرين ، وتقليل النوافذ ، وسحبها - من خلال آليات اللوحة ذات الطبقات. الميزة الرئيسية لاستخدام لوحة ذات طبقات لتلميحات الأدوات والقوائم هي سرعتها. بدلاً من إنشاء نافذة جديدة ذات وزن ثقيل لكل تلميح أداة أو قائمة ، تقع فوق المكون الذي تم فيه طلب تلميح الأداة أو القائمة ، تأرجحيخلق مكونًا سريعًا وخفيف الوزن. يتم وضع هذا المكون في طبقة عالية بدرجة كافية من اللوحة ذات الطبقات أعلاه في مجموعة المكونات الأخرى ويتم استخدامه لعرض تلميح أداة أو قائمة.

تتيح لك اللوحة متعددة الطبقات تنظيم عدد غير محدود من الطبقات. بنية JLayeredPaneيتضمن العديد من الطبقات القياسية ، والتي يتم استخدامها بواسطة جميع مكونات Swing ، مما يضمن أن جميع آليات اللوحة ذات الطبقات تعمل بشكل صحيح. تظهر طبقات JLayeredPane القياسية في الشكل التالي.

تُستخدم الطبقة الافتراضية لاستضافة جميع المكونات العادية التي تمت إضافتها إلى الحاوية. تحتوي هذه الطبقة على النوافذ الداخلية لتطبيقات المستندات المتعددة.

تم تصميم طبقة اللوحة لاستضافة النوافذ بمجموعة من الأدوات ، والتي عادة ما تتداخل مع بقية الواجهة. تتيح لك لوحة JDesktopPane إنشاء مثل هذه النوافذ ، والتي تضعها في هذه الطبقة.

تم تصميم الطبقة المشروطة لاستضافة مربعات حوار مشروطة خفيفة الوزن. ومع ذلك ، لم يتم تنفيذ مربعات الحوار هذه بعد ، لذلك لا يتم استخدام هذه الطبقة حاليًا في Swing.

الطبقة الأكثر استخدامًا للقوائم المنبثقة وتلميحات الأدوات.

الطبقة العليا. مصمم لعمليات السحب والإفلات ، والتي يجب أن تكون مرئية بوضوح في واجهة البرنامج.

يوضح مثال صغير على JLayeredPane بلوحة ذات طبقات كيفية إضافة مكونات إلى طبقات مختلفة وكيف تتراكم الطبقات فوق بعضها البعض:

استيراد javax.swing. * ؛ استيراد java.awt. * ؛ // فئة لرسم نوعين من الأشكال مع فئة النص يمتد الشكل JComponent (إصدار تسلسلي طويل خاص ثابت خاص = 1L ؛ لون خاص للون ؛ نوع int خاص ؛ نص سلسلة خاص ؛ // المعلمات: نوع اللون والشكل الشكل (لون اللون ، int type، String text) (this.color = color؛ this.type = type؛ this.text = text؛ setOpaque (false)؛) الطلاء الفارغ العام (Graphics g) (// ارسم الشكل g.setColor (color) ؛ التبديل (النوع) (الحالة 0: g.fillOval (0 ، 0 ، 90 ، 90) ؛ فاصل ؛ الحالة 1: g.fillRect (0 ، 0 ، 130 ، 80) ؛ استراحة ؛) g.setColor (اللون. أصفر) ؛ g. drawString (text، 10، 35)؛)) الفئة العامة JLayeredPaneTest يمتد JFrame (ثابت خاص نهائي طويل serialVersionUID = 1L ؛ العامة JLayeredPaneTest () (// إنشاء نافذة سوبر ("مثال LayeredTest") ؛ // الخروج عند النافذة مغلق setDefaultCloseOperation (EXIT_ON_CLOSE) ؛ // تعريف اللوحة ذات الطبقات JLayeredPane lp = getLayeredPane () ؛ // إنشاء ثلاثة أشكال Figure1 = new Figure (Color.red، 0، "Figure po جرو ") ؛ الشكل 2 = شكل جديد (اللون الأزرق ، 0 ، "الشكل 1") ؛ الشكل 3 = الشكل الجديد (اللون السماوي ، 1 ، "الشكل 2") ؛ // تحديد موقع الأشكال في شكل النافذة 1.setBounds (10 ، 40 ، 120 ، 120) ؛ الشكل2.setBounds (60 ، 120 ، 160 ، 180) ؛ figure3.setBounds (90 ، 55 ، 250 ، 180) ؛ // إضافة الأشكال إلى طبقات مختلفة lp.add (الشكل 1 ، JLayeredPane.POPUP_LAYER) ؛ lp.add (الشكل 2 ، JLayeredPane.PALETTE_LAYER) ، lp.add (الشكل 3 ، JLayeredPane.PALETTE_LAYER) ؛ // تغيير موضع أحد الأشكال lp.setPosition (الشكل 3 ، 0) ؛ // تحديد الحجم وفتح مجموعة النافذةالحجم (280 ، 250) ؛ setVisible (صحيح) ؛ ) الرئيسي العام الثابت الفارغ (سلاسل السلسلة) (JFrame.setDefaultLookAndFeelDecorated (صحيح) ؛ JLayeredPaneTest الجديد () ؛))

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

ترث فئة مساعد الشكل خصائص الفئة الأساسية JComponent وتسمح لك برسم نوعين من الأشكال (الدوائر والمستطيلات) بألوان مختلفة. يتم تعيين معلمات رسم الأشكال في مُنشئ الفئة.

عند تحديد الواجهة ، يتم إنشاء ثلاثة أشكال بألوان مختلفة (دائرتان ومستطيل). يتم وضع الدائرة في طبقة POPUP_LAYER ، ويتم وضع المستطيلات في طبقة PALETTE_LAYER. عند وضع المكونات ، يتم تحديد إحداثيات الشاشة المطلقة ، لأن مديري المواقع المعتادين لا يعملون في لوحة ذات طبقات.

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

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

جزء المحتويات

يعد ContentPane هو الجزء التالي من جزء الجذر ويستخدم لاستضافة مكونات واجهة مستخدم البرنامج. جزء المحتوياتيشغل معظم مساحة اللوحة ذات الطبقات (باستثناء المساحة التي يشغلها شريط القوائم). لمنع لوحة المحتوى من تغطية المكونات المضافة لاحقًا إلى النافذة ، تضعها اللوحة ذات الطبقات على طبقة خاصة منخفضة جدًا تسمى FRAME_CONTENT_LAYER ، مرقمة -30000.

يمكنك الوصول إلى لوحة المحتوى باستخدام getContentPane ()فئة JFrame. باستخدام طريقة الإضافة (مكون المكون) ، يمكنك إضافة أي عنصر تحكم إليها. يحل محل جزء المحتوياتأي لوحة أخرى من نوع JPanel ، يمكنك استخدام الطريقة setContentPane ()

مثال على إضافة زر إلى لوحة المحتوى:

JButton newButton = new JButton () ؛ getContentPane (). add (newButton) ؛

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

يمكن استبدال لوحة المحتوى بالكامل. ضع في اعتبارك ما يلي تأرجحمثال على لوحة المحتوى جزء المحتويات.

استيراد javax.swing. * ؛ يمتد فئة المحتوى العام ContentPaneReplace إلى JFrame (تسلسل نهائي طويل خاص وثابت خاص = 1L ؛ ContentPaneReplace العام () (super ("Test ContentPane") ؛ setDefaultCloseOperation (EXIT_ON_CLOSE) ؛ // إنشاء لوحة بها زرين محتويات JPanel = new JPanel () ؛ محتويات. add (new JButton ("Family"))؛ content.add (new JButton ("School"))؛ // استبدال جزء المحتوى setContentPane (المحتويات) ؛ // تحديد حجم مجموعة النافذة (200 ، 100) ؛ // فتح النافذة setVisible (true) ؛) main static void main (String args) (JFrame.setDefaultLookAndFeelDecorated (true) ؛ ContentPaneAdd الجديد () ؛))

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

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

JOptionPane الشفاف

لوحة شفافة JOptionPaneيتم وضعها كلوحة جذر فوق جميع عناصر اللوحة ذات الطبقات. يتم التعامل مع موضع JOptionPane بواسطة جزء الجذر ، والذي يضع الجزء الشفاف فوق جزء الطبقات بحيث يغطي مساحة النافذة بالكامل ، بما في ذلك المنطقة التي يشغلها شريط القوائم.

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

في أي الحالات يمكن استخدام لوحة شفافة؟ JOptionPane؟ يمكن استخدامه لتحديد ميزات التطبيق التي تتطلب جهدًا كبيرًا لتنفيذها من البداية. يمكن تكييف اللوحة الشفافة للاختبار الآلي لواجهة المستخدم. تسمح لك الأحداث المركبة فيه بتتبع نتائج التصحيح الوسيطة. أحيانًا يكون هذا الأسلوب أكثر فاعلية من الاختبار اليدوي.

لوحة شفافة JOptionPaneيمكن استخدامها لإنشاء رسوم متحركة رائعة "تطفو" فوق جميع المكونات ، بما في ذلك شريط القائمة ، أو لالتقاط الأحداث إذا كان بعضها بحاجة إلى التعامل معها قبل إرسالها إلى واجهة المستخدم الرئيسية.

مثال على استخدام Swing JOptionPane الشفاف:

// استخدام JOptionPane الشفاف استيراد java.awt.Dimension ؛ استيراد java.awt.Font ؛ استيراد java.awt.event.WindowEvent ؛ استيراد java.awt.event.WindowListener ؛ استيراد javax.swing.JDialog ؛ استيراد javax.swing.JFrame ؛ استيراد javax.swing.JLabel ؛ استيراد javax.swing.JOptionPane ؛ استيراد javax.swing.UIManager ؛ يمتد JOptionPaneTest للفئة العامة JFrame (ثابت خاص نهائي طويل serialVersionUID = 1L ؛ خط نهائي ثابت عام = خط جديد ("Verdana" ، Font.PLAIN ، 11) ؛ الفراغ الثابت العام createGUI () (إطار JFrame = إطار JFrame جديد ("اختبار JOptionPane ") ؛ frame.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE) ؛ frame.addWindowListener (new WindowListener () (نافذة باطلة عامة (حدث WindowEvent) () نافذة باطلة عامة مغلقة (حدث WindowEvent) () نافذة باطلة عامة معطلة (حدث WindowEvent) windowDeiconified (حدث WindowEvent) () windowIconified العامة الفارغة (حدث WindowEvent) () نافذة فارغة عامة مفتوحة (حدث WindowEvent) () نافذة فارغة عامة إغلاق (حدث WindowEvent) (خيارات الكائن = ("نعم" ، "لا!") ؛ int rc = JOptionPane.showOptionDialog (event.getWindow ()، "إغلاق النافذة؟"، "Confirm"، JOptionPane.YES_NO_OPTION، JOptionPane.QUESTION_MESSAGE، null، options، options)؛ (false)؛ System.exit (0)؛)) )) ؛ JLabel label = new JLabel ("استخدم لوحة شفافة عند إغلاق النافذة") ؛ frame.getContentPane (). add (label) ؛ frame.setPreferredSize (أبعاد جديدة (350 ، 80)) ؛ الإطار. حزمة () ؛ frame.setLocationRelativeTo (فارغ) ، frame.setVisible (صحيح) ؛ ) main static void main (String args) (javax.swing.SwingUtilities.invokeLater (new Runnable () (public void run () (UIManager.put ("Button.font، FONT))؛ UIManager.put (" Label.font "، FONT) ؛ JFrame.setDefaultLookAndFeelDecorated (صحيح) ؛ JDialog.setDefaultLookAndFeelDecorated (صحيح) ؛ createGUI () ؛))) ؛))

إذا تم تمرير أسلوب setDefaultCloseOperation بشكل ثابت JFrame.EXIT_ON_CLOSE، ثم عند إغلاق النافذة ، سيتوقف التطبيق عن العمل. في المثال ، يتم تمرير ثابت إلى هذه الطريقة JFrame.DO_NOTHING_ON_CLOSEحتى لا يحدث شيء عند إغلاق النافذة. يتم الخروج من التطبيق في المثال من مستمع JFrame WindowListener في الطريقة النافذة. عندما يتم إغلاق النافذة ، يتم استدعاء طريقة windowClosing مع معلمة حدث WindowEvent ، والتي في Swing JOptionPane الشفافة تفتح مربع حوار تأكيد.

تُظهر لقطة الشاشة التالية نافذتي تطبيق. أعلى النافذة الرئيسية. يؤدي إغلاق هذه النافذة إلى فتح مربع حوار تأكيد الهدف السفلي.

شريط القوائم JMenuBar

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

شريط القوائم JMenuBarتوضع في لوحة ذات طبقات في طبقة خاصة FRAME_CONTENT_LAYER وتحتل مساحة صغيرة في الجزء العلوي من النافذة. طول شريط القوائم يساوي حجم النافذة. يعتمد عرض شريط القوائم على المكونات التي يحتوي عليها.

تتأكد لوحة الجذر من أن لوحة المحتوى وشريط القائمة JMenuBarلا تتداخل. إذا لم يكن شريط القائمة مطلوبًا ، فإن اللوحة الجذر تستخدم كل المساحة لتلائم لوحة المحتوى.

أمثلة التأرجح

يمكن تنزيل رموز المصدر للأمثلة التي تمت مناقشتها في نص الصفحة.

دافيدوف أنطون فاليريفيتش
طالب جامعة TSU ، روسيا ، تولياتي
المستشار العلمي: إروفيفا إي.

لقد مرت واجهة المستخدم في Java بمسار شائك للغاية من التكوين والتطوير. لطالما اتُهمت بالجشع لموارد النظام وبطء الأداء والوظائف المحدودة. أدى ظهور .NET مع مكونات رسومية أسرع إلى زعزعة مكانة Java. لكن مثل هذه المنافسة حفزت مطوري Java فقط على تطوير مكتبات الرسومات وتحسينها. وفي هذا المقال سوف نرى ما جاء به.

مجموعة أدوات النافذة المجردة

تم إصدار مجموعة أدوات النافذة المجردة (اختصارًا AWT) لأول مرة في عام 1995 بواسطة Sun Microsystems. كانت المحاولة الأولى لإنشاء واجهة مستخدم رسومية لـ Java. عملت AWT كطبقة تسمى طرقًا من مكتبات مكتوبة في C. وتستخدم هذه الطرق بدورها المكونات الرسومية لنظام التشغيل. من ناحية ، بدا البرنامج الذي تم إنشاؤه بهذه الطريقة مشابهًا في المظهر لجميع البرامج الأخرى على نظام التشغيل المستخدم ، ولكن من ناحية أخرى ، يمكن أن يبدو البرنامج نفسه مختلفًا تمامًا في أنظمة التشغيل المختلفة ، مما يعقد عملية التطوير. بالإضافة إلى ذلك ، من أجل النظام الأساسي المتعدد ، كان من الضروري توحيد واجهات الاتصال للمكونات ، مما أدى إلى وظائف مبتورة إلى حد ما. مجموعة المكونات متواضعة للغاية أيضًا. على سبيل المثال ، لا توجد جداول ، ولا يمكن وضع الرموز في الأزرار. يحاول AWT الإفراج عن الموارد المستخدمة تلقائيًا. هذا يؤثر على الأداء ويعقد البنية. AWT سهل التعلم ، لكن كتابة شيء معقد أمر صعب. الآن AWT يستخدم بشكل رئيسي في التطبيقات الصغيرة. تشجع Oracle المطورين حاليًا على التبديل إلى Swing لأنه أكثر أمانًا.

الشكل 1 - نموذج برنامج مكتوب باستخدام AWT في بيئة Windows

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

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


الشكل 2 - نموذج برنامج مكتوب باستخدام Swing

مجموعة أدوات القطعة القياسية

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

الشكل 3 - نموذج برنامج مكتوب باستخدام Swing

تم إصدار JavaFX في عام 2008 بواسطة Oracle. يتم وضعه كمنصة لإنشاء تطبيق إنترنت غني. للعرض ، يتم استخدام خط أنابيب رسومات ، مما يؤدي إلى تسريع التطبيق بشكل كبير. هناك مجموعة كبيرة من المكونات المضمنة. هناك أيضًا مكونات منفصلة لرسم الرسوم البيانية. تم تنفيذ دعم لمحتوى الوسائط المتعددة والرسوم المتحركة وحتى اللمس المتعدد. يتم تكوين مظهر المكونات باستخدام أنماط CSS. بالإضافة إلى ذلك ، تتضمن مجموعة أدوات JavaFX المساعدة القدرة على إنشاء مُثبِّت أصلي للأنظمة الأساسية الأكثر شيوعًا: exe أو msi لنظام التشغيل Windows ، أو deb أو rpm لنظام التشغيل Linux ، أو dmg لنظام التشغيل Mac. يحتوي موقع Oracle على الويب على وثائق مفصلة وعدد كبير من الأمثلة الجاهزة.

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

قائمة المصادر المستخدمة

    Ryzhenko A. V. البرمجة الشيئية: مجمع تعليمي ومنهجي لتخصص 010501 - "الرياضيات التطبيقية والمعلوماتية". - 2007.

    خبيبولين آي الشيخ جافا 7 (الطبعة الرابعة). - BHV- بطرسبورغ ، 2012.

    Clarke J.، Connors J.، Bruno E. J. JavaFX: تطوير تطبيقات إنترنت غنية. - بيرسون للتعليم ، 2009.

    Northover S. ، Wilson M. Swt: مجموعة أدوات القطعة القياسية ، المجلد 1. - Addison Wesley Professional ، 2004.