مكتبات الجرافيك جافا. نظرة عامة موجزة عن Java GUI Frameworks وأول تطبيق بسيط لواجهة المستخدم الرسومية

لذلك ، يتم تنفيذ منطق Game of Life. أرغب في الاستمتاع بعملية التفكير في تنوع أشكال "الحياة" على شاشة شاشتي. ما هو المطلوب لهذا؟

سيتم إنشاء النافذة نفسها مع القوائم والأزرار ، وكذلك سلوكها باستخدام المكتبة يتأرجح.رسم عملية تطور "حياتنا" - من خلال المكتبة أ.(بتعبير أدق ، Java 2D). هاتان هما الحزمتان الرئيسيتان لإنشاء واجهات المستخدم الرسومية في Java.

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

في وقت لاحق ، أنشأت AWT مكونات لا تستخدم واجهات نظير - مكونات "خفيفة" (خفيفة الوزن). تمت تسمية مكتبة هذه المكونات باسم Swing. هذا هو ، Swing ، في الواقع ، امتداد AWT.

AWT نفسها استُكملت بأدوات جديدة للرسم وعرض الصور تسمى جافا 2D.

سأدرج مع وصف موجز العناصر الرئيسية للتأرجح.

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

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

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

JLabel(التسمية) - تستخدم لوصف (نص أو رسم) عناصر أخرى.

jButton(زر) - المكون النشط الرئيسي الذي يسمح لك بتنفيذ بعض الإجراءات عند الضغط عليه. بالإضافة إلى الطرق القياسية التي تتحكم في عرض المكون ، فإنه يحتوي على مجموعة من الأساليب لإدارة حالته (نشط / غير نشط ، محدد / غير محدد ، الماوس لأعلى / بدون ماوس ، مضغوط / محرّر).

JTextField(حقل نصي) - يسمح للمستخدم بإدخال بيانات نصية يمكن معالجتها في البرنامج.

JTextAreaيوسع JTextField للسماح بإدخال عدة أسطر.

JPasswordField(حقل كلمة المرور) - نوع من JTextField يسمح لك بإخفاء الأحرف التي تدخلها.

جي كومبو بوكس(قائمة التحرير والسرد) - تسمح للمستخدم بتحديد عنصر من قائمة موجودة (أو إضافة عنصر جديد إلى القائمة).

JCheckBox(مربع اختيار) و JRadioButton(زر الاختيار) - يوفر خيارات للمستخدم للاختيار من بينها. عادةً ما يتم تجميع أزرار JRadioButtons معًا لتزويد المستخدم بسؤال إجابة إجباري (الإجابات متنافية - يمكن أن يكون هناك إجابة واحدة فقط لكل سؤال). بمجرد تحديد زر JRadio ، لا يمكنك إلغاء تحديده حتى تحدد خيارًا آخر من المجموعة. يعمل JCheckBox بشكل مختلف. يتيح لك تحديد / إلغاء تحديد أحد الخيارات في أي وقت وتحديد إجابات متعددة لكل سؤال. الفئة التي تسمح بتجميع مكونات JCheckBox أو JRadioButton معًا هي الفئة ButtonGroup.

JSlider- عنصر لاختيار قيمة عددية من نطاق ممثل بيانياً.

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

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

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

JOptionPane- فئة لتزويد مطوري واجهة المستخدم بطريقة لإصدار رسائل بسيطة (خطأ أو معلومات أخرى) وتلقي البيانات بسرعة (على سبيل المثال ، اسم أو رقم).

jscrollpane-مكون التأرجح للتعامل مع جميع إجراءات التمرير.

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

لقد مرت الواجهة الرسومية في 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 (نسخة نهائية ثابتة خاصة من سلسلة طويلة UID = 1L ؛ نهائي ثابت عام خط= خط جديد ("Verdana"، Font.PLAIN، 11) ؛ public static void createGUI () (JFrame frame = new JFrame ("Test JOptionPane")؛ frame.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE)؛ frame.addWindowListener (new WindowListener () (public void windowActactive (WindowEvent window) (public void windowActivated (WindowEvent window) حدث WindowEvent) () نافذة فارغة عامة معطلة (حدث WindowEvent) () نافذة باطلة عامةDeiconified (حدث WindowEvent) () windowIconified العامة (حدث WindowEvent) () نافذة باطلة عامة مفتوحة (حدث WindowEvent) () نافذة باطلة عامة إغلاق (حدث WindowEvent) (كائن options = ("Yes"، "No!")؛ int rc = JOptionPane.showOptionDialog (event.getWindow ()، "إغلاق النافذة؟"، "Confirm"، JOptionPane.YES_NO_OPTION، JOptionPane.QUESTION_MESSAGE، null، options، options) ؛ if (rc == 0) (event.getWindow (). setVisible (false)؛ System.exit (0)؛)))) ؛ JLabel label = new JLabel ("استخدم لوحة شفافة عند إغلاق النافذة") ؛ إطار. getContentPane (). add (label)؛ frame.setPreferredSize (new Dimension (350، 8 0)) ؛ الإطار. حزمة () ؛ 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 فرص ممتازةلإنشاء قوائم JMenuBar مريحة تحتوي أيضًا على مكونات خفيفة الوزن.

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

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

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

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

تحذير

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

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

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

ربما لاحظت أنه في بداية الكود المصدري يوجد سطرين التاليين:

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

استيراد javax.swing. * ؛

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

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

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

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

استيراد javax.swing.JFrame ؛

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

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

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

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

إذا أردنا عرض زر في نافذة ، فنحن نحتاج فقط إلى تعريفه برمز مثل ما يلي

JButton buttonPressMe = new JButton ("اضغط علي") ؛

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

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

Dimension sSize = Toolkit.getDefaultToolkit (). getScreenSize ()

ما الذي يمكن أن يوفر مثل هذه المعلومات؟ نظام التشغيل وفقط! بعد ذلك ، استخدمنا الكود

جرب (UIManager.setLookAndFeel

(UIManager.getSystemLookAndFeelClassName ()) ،

catch (Exceptionlfe) ()

بحيث يتوافق مظهر النافذة مع المعيار المعتمد في نظام تشغيل معين. ما الذي يمكن أن يوفر مثل هذه المعلومات؟ مرة أخرى - نظام التشغيل! لذلك ، لإنشاء واجهات رسومية ، لا يمكننا الاستغناء عن الحزمة java.awt. *.

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

حزمة الاستيراد الثانية (التي تبدأ بـ javax.swing) هي المسؤولة عن بناء واجهات رسومية خفيفة الوزن (هناك حزم أخرى ، ولكن هذه الحزمة هي الأكثر أهمية وتستخدم دائمًا تقريبًا). سوف ندرس ونتقن هذه الحزمة تدريجيًا ، لأن. إنه كبير نوعا ما ومعقد نوعا ما. سنبدأ في القيام بذلك في الدرس التالي ، ولكن في الوقت الحالي ، دعنا نلقي نظرة على السطر التالي من التعليمات البرمجية المصدر:

فئة عامة MoneyForNothing يمتد إلى JFrame (

هناك عنصران جديدان هنا: الكلمة الأساسية الموسعة وكلمة JFrame.

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

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

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

في البرمجة ، يُطلق على هذا السلف عادةً "الأصل" أو "الطبقة الفائقة" ، أي الطبقة التي تنحدر منها الطبقات الأخرى. يأتي اسم الطبقة الفائقة مباشرة بعد أن يمتد. وبالتالي ، عند ترجمتها إلى لغة عادية ، يمكن قراءة مقتطف الشفرة أعلاه على النحو التالي: "class ... توسع فئة JFrame" ، أو "class ... ترث فئة JFrame" ، أو "class ... تستعير خصائص وسلوك فئة JFrame ". تحدد فئة JFrame الخصائص الأساسية وسلوك نوافذ الرسومات "القياسية". فئة JFrame نفسها موجودة في حزمة javax.swing. * ، وهذا ما قمنا باستيراده في بداية البرنامج.

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

يرجى ملاحظة أن فئة JFrame نفسها تنحدر من عدة فئات (ينتمي معظمها إلى حزمة java.awt. * المألوفة بالفعل):

لكي لا نعود إلى هذا السؤال ، نلفت انتباهك إلى حقيقة أنه في الجزء العلوي من التسلسل الهرمي للوراثة في Java توجد فئات من حزمة java.lang. *. هذه هي الحزمة الوحيدة من JDK التي لا تحتاج إلى استيرادها بشكل صريح - يتم دائمًا استيرادها تلقائيًا. بالحكم على هذا "السلم" ، فإن فئة JFrame هي حفيد حفيد java.lang.Object (تسمى الصورة أعلاه علميًا التسلسل الهرمي للطبقة).

يجب وضع جميع مكونات واجهة المستخدم الرسومية (المُختصرة باسم GUI ، من واجهة المستخدم الرسومية) ، والتي ، تذكر ، عناصر خفيفة الوزن ، داخل النافذة الرئيسية - خليفة JFrame. في الوقت الحالي ليس لدينا أي مكونات ، لكنها ستظهر قريبًا - نعدك بذلك.

والآن دعنا ننتقل إلى آخر ما لدينا مصدر الرمز، والتي تبدو كالتالي:

// البناء

المال العام مقابل لا شيء () (

setTitle ("مرحبًا بك في المال مقابل لا شيء") ؛

setSize (البعد الجديد (600 ، 400)) ؛

Dimension sSize = Toolkit.getDefaultToolkit (). getScreenSize ()،

fSize = getSize () ،

إذا (fSize.height> sSize.height) (fSize.height = sSize.height ؛)

إذا (fSize.width> sSize.width) (fSize.width = sSize.width ؛)

setLocation ((sSize.width - fSize.width) / 2 ،

(sSize.height - fSize.height) / 2) ؛

setDefaultCloseOperation (EXIT_ON_CLOSE) ،

setVisible (صحيح) ؛

بادئ ذي بدء ، قمنا بتعيين عنوان النافذة (طريقة setTitle (...)). ثم يتم ضبط الأبعاد الأفقية والعمودية للنافذة (طريقة setSize (...)). بعد تحديد دقة الشاشة للشاشة ، يتم حساب إحداثيات الزاوية اليسرى العليا من نافذتنا ويتم عرض النافذة (طريقة setLocation (...)) في الموقع المحدد على الشاشة.

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

أخيرًا ، يجعل السطر الأخير (طريقة setVisible (true)) النافذة مرئية.

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

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

حظا سعيدا ونراكم قريبا!

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

وهكذا ، ما هي الأدوات التي نحتاجها:

  • Java Virtual Machine (OpenJDK أو Oracle JDK)
  • Intellij IDEA (أو IDE آخر لـ Java)

بعد التثبيت البرامج الضرورية، يفتح IntelliJ IDEAوإنشاء مشروع جديد: ملف -> مشروع جديد ...

سميت المشروع GuiBase. كما ترى في لقطة الشاشة ، المجلد srcلا يحتوي على أي شيء ، لذلك ننشئ فيه فئة رئيسية تحتوي على الوظيفة رئيسي.

فئة عامة رئيسية (عامة ثابتة باطلة رئيسية (سلاسل سلسلة) (System.out.println ("مرحبًا ، Govzalla!") ؛))

انظر محتويات الفصل الرئيسي أعلاه. يمكننا الآن إنشاء مشروع ( بناء المشروع ) وتشغيله ( يجري ). أسفل في المحطة الطرفية الخاصة بك IDEسترى رسالة مرحبا Govzalla!. ولكن كما فهمت أنت بنفسك - فهي لا تدعم واجهة المستخدم الرسومية.

على هذه المرحلةلدينا بالفعل برنامج عمل ، ولكن بدون دعم واجهة المستخدم الرسومية. والآن في نفس المجلد srcيخلق نموذج واجهة المستخدم الرسومية: جديد -> نموذج واجهة المستخدم الرسومية

افتح نموذج واجهة المستخدم الرسومية الذي تم إنشاؤه ، وانقر فوق jPanelوتعيين معرفه في الحقل اسم الحقل، انا سألت لوحة.

ثم قم بسحب وإسقاط النموذج على الجانب الأيمن JTextField, JPasswordFieldو jButton:

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

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

في هذه اللحظةلدينا النموذج النافذة الرئيسيةوالفئة النافذة الرئيسيةمع jFrame. نحتاج الآن إلى تحديد جميع عناصر واجهة المستخدم الرسومية المضافة كمحتوى فئة النافذة الرئيسية this.getContentPane (). add (panel)؛ بعد ذلك ، سيتم تغيير محتويات ملف MainWindow.java على النحو التالي:

استيراد javax.swing. * ؛ يمتد MainWindow للفئة العامة JFrame (حقل JTextField textField1 الخاص ؛ حقل JPasswordField password1 الخاص ؛ زر JButton 1 الخاص ؛ لوحة JPanel خاصة ؛ MainWindow () (this.getContentPane (). add (panel) ؛))

إذا حاولت تشغيل الكود ، فسترى نفس الرسالة "Hello، Govzalla!" مرة أخرى. الأمر هو أننا أنشأنا فئة والشكل لها ، لكننا لم ننشئ مثيلًا لهذه الفئة.

حان الوقت لتغيير ملف Main.java وإضافة الكود لإنشاء واجهة المستخدم الرسومية الخاصة بنا هناك:

استيراد java.awt. * ؛ فئة عامة Main (عامة ثابتة باطلة رئيسية (String args) (// إنشاء مثيل لفئة MainWindow MainWindow mainWindow = new MainWindow () ؛ // حزم جميع العناصر من نموذجنا mainWindow.pack () ؛ // تغيير حجم النافذة mainWindow.setSize (new Dimension (200، 200))؛ // عرض النافذة الرئيسية التي تم إنشاؤهاWindow. setVisible (true) ؛))

تشغيل الكود

بالنقر فوق الزر ، ستلاحظ أن البرنامج لا يتفاعل بأي شكل من الأشكال. الشيء هو أننا لم نضف المستمع بعد ( المستمع) للأحداث ( الأحداث) من الزر.

مستمع الحدث ( مستمع الحدث) jButtonيجب أن يكون تنفيذ محول مستمع العمل، لذا أضف الكود التالي إلى نص الفصل النافذة الرئيسية:

فئة خاصة MyButtonListener تنفذ ActionListener (Override public void actionPerformed (ActionEvent actionEvent) ())

طريقة العمل المؤدى() سيتعامل مع جميع أحداث الزر button1 ، ولكن لا يزال يتعين عليك أولاً إخبار button1 بالفئة التي سيتعامل معها ، لذا أضف الكود التالي إلى مُنشئ الفئة MainWIndow: this.button1.addActionListener (new MyButtonListener ())؛ حتى لا يكون معالجنا بلا معنى ، أضف الكود التالي إلى الطريقة العمل المؤدى():

Override public void actionPerformed (ActionEvent actionEvent) (if (textField1.getText (). يساوي (passwordField1.getText ())) (JOptionPane.showMessageDialog (null، "Success")؛) else (JOptionPane.showMessageDialog (null، "Failure ") ؛))

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

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

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

نشر على 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 ++.



تحميل...
قمة