الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يتم تغيير لون الكلمة بشكل تلقائي ؟؟

بدأه MKSoft في 21 يوليو 2008 · 16 رد · 2,002 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد بناء محرر للغة برمجة , بحيث يتم تغيير لون بعض الكلمات الخاصة مثل برنامج JCreator .

لقد استخدمت في ذلك JTextPane , ولكن لا اعرف كيف اجعل المحرر يقوم بتغيير اللون بشكل تلقائي عند كتابة كلمة اساسية .

لقد استخدمت Thread لمحاولة دعم هذه العملية , لكن خبرتي متواضعة في تكنولوجيا Threads .

لذلك اتمنى اخواني منكم مساعدة في ذلك , بغض النظر عن استخدام Thread او غيرها ..

#2

قم بوضع مستمع على الحروف KeyListner

وعند كتابة حرف جديد

ابحث عن المسافة التي قبله والمسافة التي بعده

بهذا تحصل على كلمة

إن كانت هذه الكلمة من الكلمات التي تريد تلوينها

فلونها

لي عتاب عليك أخي

لماذا لا نراك إلا عندما تحتاج مساعدة؟

ومثلك الكثير في منتدى جافا

أحياناً أفكر في أن أقصر مساعدتي

على الأخوة الذين يشاركونا بشكل مستمر

لكني لحد الآن لم آخذ خطوات إيجابية في الموضوع

ربما يكون لي موقف قريباً

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3
اقتباس
قم بوضع مستمع على الحروف KeyListner

وعند كتابة حرف جديد

ابحث عن المسافة التي قبله والمسافة التي بعده

بهذا تحصل على كلمة

إن كانت هذه الكلمة من الكلمات التي تريد تلوينها

فلونها

بارك الله فيك أخي على المساعدة , على الرغم اني جربت هذا الأسلوب قبلا , وسأحاول تجريبه ثانية .

اقتباس
لي عتاب عليك أخي

لماذا لا نراك إلا عندما تحتاج مساعدة؟

ومثلك الكثير في منتدى جافا

أحياناً أفكر في أن أقصر مساعدتي

على الأخوة الذين يشاركونا بشكل مستمر

لكني لحد الآن لم آخذ خطوات إيجابية في الموضوع

ربما يكون لي موقف قريباً

سامحك الله اخي الكريم على هذا الكلام , حيث كان الأجدر بك ان لا تقول ذلك , بل ان تجد لي العذر في ذلك , فلربما اني لا امتلك خبرة كافية في البرمجة

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

#4

اطرح شيفرتك وسننظر فيها

في البداية أنا لا أقصد شخص بعينه بكلامي

لكني أتذكر آخر موضوع ساعدتك فيه أظن كان له علاقة بالشبكات

فأثرت في نفسي هذه الخواط

أخي نحن نعذر الكل

لكن في رأيي كلامك غير صحيح هنا

تؤهلني لان اشارك في مواضيع كبيرة , او لان المواضيع التي املكها لا تستحق الجهد و القراءة , او انها مواضيع سبق وان تم طرحها

أي موضوع ستطرحه سيكون له أثر في المنتدى

وتأكد أنك ستستفيد من طرح المواضيع

مثل ما يستفيد الآخرين وربما أكثر

جرب ذلك ولن تخسر شيء

وستدعي لي في المستقبل

وآسف إن كنت أخطأت في حقك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

السلام عليكم

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

ready to do full students projects

digitalscenter@hotmail.com

+966530357742

#6

السلام عليكم

اشكركم إخواني على المساعدة , واخص بالذكر اخي alaadiaa , وبارك الله فيكم .

طبعا انا حاولت قبلا ان اقوم بذلك من خلال Thread , وهذه محاولاتي تجدونها في الملف المرفق .

SajaLangCreator.rar

#7

لكي تقوم بعمليه التعرف على الحروف التي ستتلون ، يمكن أستخدام الـ Regular expression حيث هي طريقه تستطيع من خلالها وضع تحديد أشكال الحروف Token التي تكون الكلمات المحجوزه والتي تريد تلوينها ، وبعدها عندما يتم التعرف عليه قم بعمليه التلوين ...

طبعا الموضوع ليس سهل ، وهو يستخدم في تصميم المترجمات عندما نريد تعريف أشكال المعرفات Identifier والأرقام ، والفراغات وأمور أخرى ،

لحسن الحظ فهناك مكتبه كامله في جافا لعمليه تعريف الToken ، تجدها في المكتبه :

java.util.regex

مقال بسيط عن هذه المكتبه :

Regular Expressions and the Java Programming Language

حل أخر ، وهو أستخدام مكتبات مفتوحه المصدر مخصصه لهذا الغرض ، مثل : JEdit-Syntax

أيضا : Syntax Highlighting

بالتوفيق ،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 22 يوليو 2008 في 13:54

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#8

العفو أخي

قمت بالتعديل على شيفرتك بحيث أصبحت تعمل

طبعاً لم يعجبني الأداء بالمرة

ولهذا أكتب لك الشيفرة التالية لتساعدك على التحسين

		Document doc=jTextPane1.getDocument();
		doc.addDocumentListener(new DocumentListener(){

			public void changedUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub

			}

			public void insertUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub

			}

			public void removeUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub

			}

		});

أظن الشيفرة واضحة

إن أردت توضيح فلا تخجل

تحياتي

SajaLangCreator.rar

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

بارك الله فيك أخي Wajdy Essam و اخي alaadiaa . وشكرا على المشاركة .

اخي alaadiaa عندي بعض الإستفسارات :

1- ما الفرق بين السطرين التاليين ؟؟

int newCodeLength=jTextPane1.getDocument().getLength();
			int codeLength=code.length();

2- ماذا تعني هذه الجملة ؟

int lastPosition =jTextPane1.getCaretPosition();

3- مافائدة هذا السطر ؟

jTextPane1.getDocument().remove(counter, word.length());

4- مافائدة هذا السطر ؟

jTextPane1.setCaretPosition(lastPosition);

5- في السطر التالي , على ماذا تدل كلمة العداد counter ??

jTextPane1.getDocument().insertString(counter, word, BLACK);
#10
MKSoft كتب:
بارك الله فيك أخي Wajdy Essam و اخي alaadiaa . وشكرا على المشاركة .

الله يبارك فيك أخي

اخي alaadiaa عندي بعض الإستفسارات :

قبل الإستفسارات أحب أن أرسخ المفهوم التالي

أنا أقوم في الشيفرة التي أعطيتك إياها

بقراءة النص الموجود في jTextPane1

وأعيد كتابته مرة أخرى

أقوم بتقسيم الشيفرة إلى أسطر

ثم أقوم بتقسيم الأسطر إلى كلمات

بعد هذا أمر على جميع الكلمات في كل السطور

وأرى هل الكلمة هي محمد فألونها باللون الأزرق

وإلا أقوم بكتابتها باللون الأسود

1- ما الفرق بين السطرين التاليين ؟؟

int newCodeLength=jTextPane1.getDocument().getLength();
			int codeLength=code.length();

الخيط يقوم بإعادة الكتابة دائماً

وهذا طبعاً سيء

فأردت أن تكون إعادة الكتابة في حالة أن الشيفرة اختلفت

على فكرة وأنا أراجع الشيفرة وجدت أن الشرط يجب أن يكون newCodeLength!=codeLength

2- ماذا تعني هذه الجملة ؟

int lastPosition =jTextPane1.getCaretPosition();

هذه الجملة تحتفظ بمكان المؤشر حتى عندما أنتهي من الكتابة

أرجع المؤشر إلى مكانه

3- مافائدة هذا السطر ؟

jTextPane1.getDocument().remove(counter, word.length());

هذه الجملة تقوم بحذف النص القديم

لتهئية المكان للنص الجديد الملون

4- مافائدة هذا السطر ؟

jTextPane1.setCaretPosition(lastPosition);

هذه الجملة تقوم بإعادة المؤشر إلى المكان الذي كان عليه

قبل البدء في عملية إعادة الكتابة

5- في السطر التالي , على ماذا تدل كلمة العداد counter ??

jTextPane1.getDocument().insertString(counter, word, BLACK);

تدل على مكان الإدراج

بالطبع سيكون مكان الإدراج عبارة عن متغير يزيد كل مرة بمقدار حجم الكلمة + المسافة بينها وبين الكلمة الثانية

على فكرة الشيفرة المرفقة في المرة السابقة

سيئة إلى أبعد الحدود ولكنها تقوم بالعمل

لكي تحصل على أداء جيد استخدم مستمع على لوحة المفاتيح Key Listener

أو مستمع على المستند Document Listener الذي أرفقت لك طريقته المرة السابقة

بصراحة أنا أفضل الثانية لأنها أداءها أفضل بكثير

ولست بحاجة إلى تعقيدات أنواع المفاتيح وخلافه

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

بارك الله فيك أخي alaadiaa ,

بالنسبة Document Listener , ماهي المتطلبات التي تلزم تشغيله , بمعنى ماهي package المطلوبة لتشغيلة , وما هو interface المطلوب

عمل له implementation في داخل class الذي يستخدم Document Listener .

#12

يمكنك مراجعة ردي الذي أرفقت لك فيه الشيفرة

بسهولة يمكنك التعامل معه

فقط انظر إلى دوال الفئة DocumentEvent

وعلى أساسها ابحث عن المنطقة التي تغير فيها المستند Document

وقم بإجراء المعالجة عليها

سأحاول أن أعمل لك مثال بسيط عليها

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#13

انا في الإنتظار أخي الكريم

شكرا على مجهوداتك

#14

السلام عليكم ورحمة الله وبركاته

أخواني الأعزاء أنا حملت الملف لكن عندما قمت بتنفيذه لم يقم بعمل ماذكرتموه لا بالتلوين ولا والإستبدال!!

ممكن أعرف كيف يشتغل؟

وبالنسبه للkey Listener كيف أقدر أخليه يقوم بعمل الـ isdigit و isalpha في الـc++

بحيث أني أخلي الـ JTextField مايقبل إلا حروف أو أرقام

وجزاكم الله خير


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#15

اطلع على موضوع keyListener بشكل أوسع

وحاول وإن لم تستطع اطرح مرة ثانية

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#16

أشكرك أخي علاء على الرد

بس أنا قد أشتغلت قبل كذا على الـkeyListener بس مالقيت في أحداثها أي شئ من اللي سألت عنه , أقدر أخرج رقم الآسكي كود حق الحرف المدخل وأحصر الشرط مابين الـ 65 وال95 أو أقل شويه واللي هي تمثل الحروف بس لكن هذه الطريقه غير عمليه

لأنه قد يدخل المستخدم مثلاً رموز وطبعاً تختلف شفرتها وهذه مشكله

أما في الـ c++ فكان يكفي أني أكتبisalpha في الشرط وخلاص :)

فهمت قصدي؟


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#17

جزاكم الله خير

والله وفرتم علي قراءة اشياء كثير أنا واقف في عمل محرر للجافا بالجافا من شهرين وأن شاء الله هكمله بعد الامتحانات

----------------

أخوي علاء علشان مطبقش علي القوانين الجديدة انا بدخل المنتدي بس مبعرفش أرد علي حاجة فمبردش

مدونتي

برمجة وما يتبعها

مواضيع مشابهة