1. مراقبة الحدث
رمز الاختبار 1:
Package Cn.Javastudy.Summary ؛ استيراد java.awt. }} class myframetextfield يمتد الإطار {myframetextfield () {textfield tf = new textfield () ؛ إضافة (TF) ؛ TF.AddActionListener (New Monitor3 ()) ؛ tf.setechochar ('*') ؛ / * * طريقة setechochar () هي تعيين الأحرف المعروضة عند الإدخال في مربع النص. هنا يتم تعيينه على *، بحيث سيتم عرض أي محتوى إدخال على أنه *، ولكن لا يزال بإمكانك رؤية محتوى الإدخال عند الطباعة */ setVisible (True) ؛ علية()؛ }} class monitor3 تنفذ ActionListener { / * * جميع الأساليب في الواجهة عامة (عامة) * لذلك عند نسخ Actionperformed (ActionEvent E) من وثيقة API ، يجب عليك إضافة عام أمام void * /public void actionperformed (ActionEvent e) { / * المعلومات ذات الصلة بالحدث مغلف في الكائن e. يمكن الحصول على المعلومات ذات الصلة للحدث من خلال الأساليب ذات الصلة للكائن e*/ textfield tf = (textfield) e.GetSource () ؛ / * * طريقة getSource () هي الحصول على مصدر الحدث. ملاحظة: عندما تحصل على مصدر الحدث هذا ، * تعامله باسم فئة الوالدين في Textfield. إن تعريف طريقة getSource () هو: "قيمة الكائنات العامة getSource ()" "قيمة الإرجاع هي كائن كائن ، * لذلك يجب عليك إلقاءها على كائن من نوع textfiled tf.settext ("") ؛ // امسح المحتوى في مربع النص}} رمز الاختبار 2:
حزمة Cn.Javastudy.Summary ؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ public class actactactionevent2 {public static void main (string args []) زر btn1 = زر جديد ("ابدأ") ؛ زر btn2 = زر جديد ("توقف") ؛ monitor2 m2 = new monitor2 () ؛ // إنشاء كائن الاستماع btn1.addActionListener (M2) ؛ /*يستمع كائن الاستماع إلى تصرفات زرين في نفس الوقت*/ btn2.addActionListener (M2) ؛ BTN2.SetActionCommand ("GameOver") ؛ // قم بتعيين معلومات الإرجاع بعد تنفيذ أمر النقر فوق BTN2 F.ADD (BTN1 ، BorderLayout.north) ؛ F.Add (BTN2 ، BorderLayout.Center) ؛ f.pack () ؛ F.SetVisible (صحيح) ؛ }} class monitor2 تنفذ ActionListener {public void actionperformed (ActionEvent e) {system.out.println ("تم الضغط على زر" ،+"المعلومات النسبية هي:/n"+e.getActionCommand ()) ؛ /* استخدم كائن الاستماع الذي تم إرجاعه e للاتصال بالطريقة getActionCommand () للحصول على معلومات الإرجاع بعد تنفيذ الأزرار على أمر النقر. وفقًا لمعلومات الإرجاع المختلفة ، فإن الزر هو العملية الحالية. لا يستخدم BTN1 طريقة SetActionCommand () لتعيينها ، وبالتالي فإن المعلومات التي يتم إرجاعها بواسطة BTN1 هي النص المعروض على الزر*/}}2. مراقبة حدث Textfield
رمز الاختبار:
Package Cn.Javastudy.Summary ؛ استيراد java.awt. }} class myframetextfield يمتد الإطار {myframetextfield () {textfield tf = new textfield () ؛ إضافة (TF) ؛ TF.AddActionListener (New Monitor3 ()) ؛ tf.setechochar ('*') ؛ / * * طريقة setechochar () هي تعيين الأحرف المعروضة عند الإدخال في مربع النص. هنا يتم تعيينه على *، بحيث سيتم عرض أي محتوى إدخال على أنه *، ولكن لا يزال بإمكانك رؤية محتوى الإدخال عند الطباعة */ setVisible (True) ؛ علية()؛ }} class monitor3 تنفذ ActionListener { / * * جميع الأساليب في الواجهة عامة (عامة) * لذلك عند نسخ Actionperformed (ActionEvent E) من وثيقة API ، يجب عليك إضافة عام أمام void * /public void actionperformed (ActionEvent e) { / * المعلومات ذات الصلة بالحدث مغلف في الكائن e. يمكن الحصول على المعلومات ذات الصلة للحدث من خلال الأساليب ذات الصلة للكائن e*/ textfield tf = (textfield) e.GetSource () ؛ / * * طريقة getSource () هي الحصول على مصدر الحدث. ملاحظة: عندما تحصل على مصدر الحدث هذا ، * تعامله باسم فئة الوالدين في Textfield. إن تعريف طريقة getSource () هو: "قيمة الكائنات العامة getSource ()" "قيمة الإرجاع هي كائن كائن ، * لذلك يجب عليك إلقاءها على كائن من نوع textfiled tf.settext ("") ؛ // امسح المحتوى في مربع النص}} تطبيق آلة حاسبة بسيطة باستخدام فئة Textfield
Package cn.javastudy.summary ؛ استيراد java.awt. }}/* هنا بشكل أساسي لإكمال تخطيط عناصر الآلة الحاسبة*/فئة tfframe يمتد الإطار {tfframe () {/** إنشاء 3 مربعات نصية وحدد أحجامها الأولية لتكون 10 أحرف و 15 حرفًا على التوالي. فيما يلي طريقة بناء أخرى لفئة Textfield Public Textfield (أعمدة int) */ textfield num1 = New Textfield (10) ؛ textfield num2 = new Textfield (10) ؛ Textfield num3 = New Textfield (15) ؛ /* إنشاء زر علامة متساوية*/ زر btnequal = زر جديد ("=") ؛ btnequal.addActionListener (new mymonitor (num1 ، num2 ، num3)) ؛ /* أضف مستمعًا إلى زر التسجيل المتساوي بحيث يحدث حدث استجابة بعد النقر فوق الزر*/ lable lblplus = new label ("+") ؛ /* "+" هو نص ثابت ، لذا استخدم فئة التسمية لإنشاء كائن نص ثابت*/ setLayout (New FlowLayout ()) ؛ /* قم بتغيير تخطيط BorderLayout الافتراضي للإطار إلى تخطيط FlowLayout*/ Add (num1) ؛ إضافة (lblPlus) ؛ إضافة (num2) ؛ إضافة (btnequal) ؛ إضافة (num3) ؛ علية()؛ setVisible (صحيح) ؛ }} class myMonitor تنفذ ActionListener {textfield num1 ، num2 ، num3 ؛ / * * من أجل تمكين الاستماع إلى الأزرار للعمل على مربعات النص ، * لذلك ، يتم تعريف ثلاثة كائنات Textfield في الفئة المخصصة MyMonitor في Num1 ، num2 ، num3 ، * كما تحدد طريقة مُنشئ لفئة mymonitor. تحتوي طريقة المنشئ هذه على ثلاث معلمات من نوع Textfield ، * يتم استخدامها لتلقي ثلاثة معلمات من نوع Textfield تم تمريرها من فئة TFFRAME * ثم تعيين ثلاثة معلمات من نوع Textfield إلى المعلمات الثلاثة من نوع Textfield المعلن في هذه الفئة. ثم معالجة num1 ، num2 ، num3 في actionperformed () method */ public mymonitor (textfield num1 ، textfield num2 ، textfield num3) {this.num1 = num1 ؛ this.num2 = num2 ؛ this.num3 = num3 ؛ } public void actionperformed (ActionEvent e) { /* يتم تغليف المعلومات ذات الصلة للحدث في الكائن e. يمكن الحصول على المعلومات ذات الصلة للحدث من خلال الأساليب ذات الصلة للكائن e*/ int n1 = integer.parseint (num1.getText ()) ؛/*num1 كائن يستدعي طريقة getText () للحصول على كائن النصوص المعروضة بنفسه*/ int n2 = integer.parseint (num2.gettext () ؛/*num2. num3.settext ("" + (n1 + n2)) ؛/* num3 كائن يستدعي طريقة setText () لتعيين نص العرض الخاص به*/ num1.settext ("") ؛ / * بعد اكتمال الحساب ، قم بمسح محتويات مربعات النص Num1 و Num2 */ num2.settext ("") ؛ // num3.settext (string.valueof ((n1+n2))) ؛ /* عند توصيل السلاسل بأي نوع من البيانات باستخدام "+" ، يجب أن تكون السلسلة سلسلة. * فيما يلي سلسلة فارغة ورقم نوع int ، بحيث يمكن تحويل رقم النوع int الذي تم الحصول عليه بواسطة (N1+N2) مباشرة إلى سلسلة. * هذه خدعة صغيرة لتحويل أنواع البيانات الأساسية الأخرى إلى سلاسل. * يمكنك أيضًا استخدام "string.valueof ((n1+n2))" لتحويل مجموع (n1+n2) إلى سلسلة */}} الاستخدام الكلاسيكي في جافا: عقد إشارات إلى فصل آخر في فصل واحد
Package Cn.Javastudy.Summary ؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ الطبقة العامة testmath1 {public static void main (String args []) {new ttmyframe (). launchframe () ؛ /* قم بإنشاء كائن TTMyframe واستدعاء طريقة lauchframe () لعرض نموذج الآلة الحاسبة*/}}/* اجعل واجهة النموذج الخاصة بالآلة الحاسبة*/class ttmyframe يمتد الإطار {/* تغليف الكود الذي يقوم بتصميم نموذج الآلة الحاسبة إلى طريقة*/textfield num1 ، num2 ، num3 ؛ public void LaunchFrame () {num1 = new TextField (10) ؛ num2 = new Textfield (15) ؛ num3 = New Textfield (15) ؛ Lable lblPlus = new label ("+") ؛ زر btnequal = زر جديد ("=") ؛ btnequal.addActionListener (mymonitorbtnequal جديد (هذا)) ؛ setLayout (New FlowLayout ()) ؛ إضافة (num1) ؛ إضافة (lblPlus) ؛ إضافة (num2) ؛ إضافة (btnequal) ؛ إضافة (num3) ؛ علية()؛ setVisible (صحيح) ؛ }}/ * * هنا ، من خلال الحصول على مرجع إلى فئة ttmyframe ، ثم استخدام هذا المرجع للوصول إلى متغيرات الأعضاء في فئة ttmyframe * هذا النهج أفضل بكثير من الطريقة السابقة للوصول مباشرة إلى متغيرات الأعضاء في فئة ttmyframe ، * الآن تحتاج إلى الوصول إلى متغيرات الأعضاء في فئة ttmyframe ، ويمكنك الوصول بشكل مباشر إلى variables ttmairs. * يشبه كائن فئة TTMyframe هذا مدبرة منزل كبيرة ، وأخبرت مدبرة المنزل الكبيرة أنني أريد الوصول إلى متغيرات الأعضاء في فئة Ttmyframe ، * ستساعدني مرجع Big Abserening في العثور عليه ، ولم أعد بحاجة إلى العثور عليه بنفسي. * هذا الاستخدام لعقد الإشارات إلى فئة أخرى في فصل واحد هو استخدام نموذجي للغاية* استخدم المرجع الذي تم الحصول عليه للوصول إلى جميع أعضاء فئة أخرى في فئة واحدة*/class mymonitornequal تنفيذ ActionListener {ttmyframe ttmf = null ؛ public mymonitorbtnequal (ttmyframe ttmf) {this.ttmf = ttmf ؛ } public void actionperformed (Actionevent e) {int n1 = integer.parseint (ttmf.num1.getText ()) ؛ int n2 = integer.parseint (ttmf.num2.getText ()) ؛ ttmf.num3.settext ("" + (n1 + n2)) ؛ ttmf.num1.settext ("") ؛ ttmf.num2.settext ("") ؛ }}نتائج التشغيل كما يلي:
ثالثا. الطبقة الداخلية
أمثلة على الفصول الداخلية:
Package cn.javastudy.summary ؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ الطبقة العامة testmath3 {public static void main (string args []) {new mymathframe (). launchframe () ؛ }} class mymathframe يمتد الإطار {textfield num1 ، num2 ، num3 ؛ public void LaunchFrame () {num1 = new TextField (10) ؛ num2 = new Textfield (15) ؛ num3 = New Textfield (15) ؛ Lable lblPlus = new label ("+") ؛ زر btnequal = زر جديد ("=") ؛ btnequal.addActionListener (new mymonitor ()) ؛ setLayout (New FlowLayout ()) ؛ إضافة (num1) ؛ إضافة (lblPlus) ؛ إضافة (num2) ؛ إضافة (btnequal) ؛ إضافة (num3) ؛ علية()؛ setVisible (صحيح) ؛ } /*** فئة mymonitor هذه هي فئة داخلية ، والتي تحدد فئة myframe في فئة myframe تسمى فئة Wrapper* / /** فوائد استخدام الفئات الداخلية:* الفائدة الأولى الضخمة هي أنه يمكنه الوصول إلى جميع متغيرات الأعضاء والطرق الثلاثة ، على سبيل المثال ، num1 ، num1 ، num1 ، num1 num1 ، num1 ، num1 ، num1 ، num1 ، num1 ، (فئة خارجية) ،* يمكنك الوصول إليها مباشرة في MyMonitor (الفئة الداخلية)* وهذا يعادل كائن الفئة الداخلية التي لها مرجع إلى كائن الفئة الخارجية بشكل افتراضي عند إنشاء كائن فئة خارجي*/ فئة خاصة MyMonitor تنفذ ActionListener {public void actionperformed (actionevent e) {int n1 = integer.parseint (num1.gettext () ؛ int n2 = integer.parseint (num2.getText ()) ؛ num3.settext ("" + (n1 + n2)) ؛ num1.settext ("") ؛ num2.settext ("") ؛ }}}الفوائد الضخمة للفصول الداخلية هي:
4. الرسومات
رمز الاختبار:
Package Cn.Javastudy.Summary ؛ استيراد java.awt.*؛ الطبقة العامة testpaint {public static void main (string args []) {new MyPaint (). laungframe () ؛ /*لا يتم عرض طريقة الطلاء (الرسومات G) في الطريقة الرئيسية () ، ولكن بعد إنشاء نموذج الإطار ، يمكنك أن ترى أن الدوائر والمستطيلات يتم رسمها على نموذج الإطار. وذلك لأن طريقة الطلاء () هي طريقة خاصة. سيتم الاتصال تلقائيًا بشكل ضمني عند إنشاء نموذج الإطار. عندما نقلل من نموذج الإطار ونفتحه مرة أخرى ، سنقوم باستدعاء طريقة Paint () مرة أخرى ونرسم الدوائر والمستطيلات على شكل الإطار. أي في كل مرة نحتاج فيها إلى إعادة رسم نموذج الإطار ، سيتم توجيه طريقة Paint () تلقائيًا*/}} فئة MyPaint تمتد الإطار {public void launchframe () {setBounds (200،200،640،480) ؛ setVisible (صحيح) ؛ } الطلاء الباطل العام (الرسومات G) { / *Paint (Graphics G) طريقة معلمة من نوع الرسومات G يمكننا علاج هذا G كرسام ، ويحمل الرسام فرشاة في يده ، ونرسم الصور المختلفة التي نريدها عن طريق ضبط لون وشكل الفرشاة * / / *. G.Filloval (100،100،100،100) ؛/*ارسم القطع الناقص الصلب*/ g.setColor (color.green) ؛ G.FillRect (150،200،200) ؛/*ارسم مستطيلًا صلبًا*//*يتم كتابة سطرين من الكود أدناه لعادات البرمجة الجيدة في برامج الكتابة. الآن يجب عليك استعادة اللون الأولي للفرشاة ، وهو ما يعادل تنظيف اللون على الفرشاة بعد أن يستهلك الرسام الفرشاة*/ اللون C = G.GetColor () ؛ G.SetColor (C) ؛ }}نتائج التشغيل:
5. محول حدث الماوس
رمز الاختبار:
حزمة cn.galc.test ؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ استيراد java.util.*؛ الطبقة العامة mymouseadapter {public static void main (string args []) {new myframe ("drawing ...") ؛ }} class myframe يمتد الإطار {ArrayList Points = null ؛ myFrame (سلسلة s) {super (s) ؛ نقاط = ArrayList () جديدة ؛ setLayout (NULL) ؛ SetBounds (300،300،400،300) ؛ this.setbackground (لون جديد (204،204،255)) ؛ setVisible (صحيح) ؛ this.addmouselistener (new monitor ()) ؛ } public void paint (Graphics g) {iterator i = points.iterator () ؛ بينما (i.hasnext ()) {point p = (point) i.next () ؛ G.SetColor (color.blue) ؛ G.Filloval (PX ، PY ، 10،10) ؛ }} public void addPoint (point p) {points.add (p) ؛ }} شاشة الفئة يمتد mouseadapter {public void mousepressed (mouseevent e) {myFrame f = (myframe) e.getSource () ؛ F.AddPoint (New Point (E.GetX () ، E.Gety ())) ؛ f.repaint () ؛ }}6. حدث Windows
رمز الاختبار:
حزمة cn.galc.test ؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ فئة عامة testwindowclose {public static void main (string args []) {new windowframe ("elut windowframe") ؛ }} class windowframe يمتد الإطار {public windowframe (سلسلة s) {super (s) ؛ SetBounds (200،200،400،300) ؛ setLayout (NULL) ؛ انتكاسة (لون جديد (204،204،255)) ؛ setVisible (صحيح) ؛ هذا. فئة مجهولة كفئة WindowAdapter. System.exit (-1) ؛ } /*يتم تعريف فئة الاستماع أيضًا على أنها فئة داخلية* /فئة WindowMonitor تمتد WindowAdapter { /*WindowAdapter (Window Adapter) تنفذ واجهة الاستماع إلى WindowListener. أعد كتابة جميع الطرق في واجهة WindowListener. إذا كنت تستخدم فئة WindowMonitor المخصصة مباشرة لتنفيذ واجهة WindowListener مباشرة ، فيجب عليك إعادة كتابة جميع الطرق في واجهة WindowListener. ولكن الآن تحتاج فقط إلى استخدام إحدى هذه الطرق. لذلك ، يمكنك أن ترث فئة فرعية من واجهة الاستماع إلى WindowListener وإعادة كتابة الطريقة التي تحتاج إلى استخدامها في هذه الفئة الفرعية. هذه الطريقة أبسط بكثير وأكثر ملاءمة من تنفيذ واجهة الاستماع مباشرة من WindowListener. */*إعادة كتابة طريقة windowsclosing (windowevent e) التي يجب استخدامها*//*public void windowsclosing (windowevent e) {setVisible (false) ؛/*قم بتعيين النموذج لعدم عرضه ، ويتم إغلاق النموذج*/system.exit (0) ؛7. حدث استجابة لوحة المفاتيح - KeyEvent
رمز الاختبار:
حزمة cn.galc.test ؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ الطبقة العامة testkeevent {public static void main (string args []) {new Keyframe ("حدث استجابة لوحة المفاتيح") ؛ }} الفئة keyframe يمتد الإطار {public keyframe (string s) {super (s) ؛ SetBounds (200،200،400،300) ؛ setLayout (NULL) ؛ setVisible (صحيح) ؛ AddKeyListener (New Keymonitor ()) ؛ } /*حدد فئة الاستماع إلى لوحة المفاتيح المخصصة على أنها فئة داخلية. يرث فئة الاستماع هذه من فئة محول لوحة المفاتيح KeyAdapter. يرث من فئة KeyAdapter. لكي تكون موجزًا ومريحًا ، تحتاج فقط إلى إعادة كتابة الأساليب التي تحتاجها إلى استخدامها. هذه الطريقة أبسط وأكثر ملاءمة من تنفيذ واجهة القائمة الرئيسية مباشرة. إذا قمت بتنفيذ واجهة KeyListener مباشرةً ، فيجب عليك إعادة كتابة جميع الطرق في واجهة KeyListener ، ولكن يتم استخدام طريقة واحدة فقط. وبهذه الطريقة ، فإن إعادة كتابة الأساليب الأخرى ولكن عدم استخدامها سوف يقوم حتماً بعمل عديمة الفائدة*/ فئة Keymonitor يمتد KeyAdapter {public void keypressed (keyevent e) {int keycode = e.getKeyCode () ؛ /*استخدم طريقة getKeyCode () للحصول على الكود الظاهري للمفتاح* / /*إذا كان الكود الظاهري للمفتاح الذي تم الحصول عليه مساوياً للرمز الافتراضي لمفتاح UP ، فهذا يعني أن المفتاح الذي تم الضغط عليه حاليًا هو مفتاح UP keyevent.vk_up يعني أن الرمز الافتراضي للحصول على مفتاح UP. كل مفتاح في لوحة المفاتيح يتوافق مع رمز افتراضي. يتم تعريف هذه الرموز الافتراضية على أنها ثوابت ثابتة في فئة KeyEvent. لذلك ، يمكنك استخدام نموذج "اسم الفئة. الاسم الثابت" للوصول إلى هذه الثوابت الثابتة*/ if (keycode == keyevent.vk_up) {system.out.println ("أنت تضغط على مفتاح UP") ؛ }}}}/*تتولى لوحة المفاتيح أحداث مثل هذا: كل مفتاح يتوافق مع رمز افتراضي. عند الضغط على مفتاح معين ، سيجد النظام الرمز الظاهري المقابل لهذا المفتاح لتحديد المفتاح الذي يتم الضغط عليه حاليًا*/من خلال هذه المقالة ، تعلمت برمجة واجهة المستخدم الرسومية معك. آمل أن يكون لديك فهم أكثر شمولاً لبرمجة واجهة المستخدم الرسومية. هناك أكثر من هذا حول برمجة واجهة المستخدم الرسومية ، وتحتاج إلى مواصلة التعلم.