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

كيف اعيد وضع RadioButton الى وضع ال false

مغلق
بدأه waheed11 في 27 نوفمبر 2005 · 23 رد · 1,778 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني و أخواتي

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

لدي فريم يوجد فيه هذا الامر: ;(cc125= new JRadioButton("125 CC Value", false

طبعاً هذا الامر يجعل الـ JRadioButton في وضعية عدم الاختيار

ولكن عندما اختارة فأنه يتحول طبعا الى وضعية الاختيار و يبقى كذلك الى ان يتم تشغيل الفريم مرة اخرى

سؤالى هو ما هي الطريقة التي تتحكم في و ضعية الـ JRadioButton أثناء ما نكون شغالين على نفس الفريم يعني نحول وضعية الاختيار من false الى true و العكس

#2

لما تحول false إلى true

ايش بتكون المشكلة ؟

#3

يعني عندك JRadioButton اسمه x

x.setSelected(true);
#4

الحل كما ذكر الأخ alnabris بإمكانك استبدال الـ true بـ false بحسب الوضعية التي تريده بها.

ولكن الوضع الطبيعي للـ RadioButton أن يتغير من true إلى false عندما تختار غيره من نفس المجموعة Group، أما أن يكون وحيداً ليس ضمن مجموعة تحوي RadioButtons أخرى فهذا أمر غريب منطقياً بالنسبة للمستخدم.

#5

جربت الحل هذا قبل كذه ما مشي الحال

يعني علشان تقترب الصورة يعمل الفريم لإدخال قيم مثل إضافة سجلات في قاعدة البيانات لمن اضغط على التالي يحفظ ثم يعمل clear لجميع القيم الى انا ادخلتها وينتقل لسجل جديد فارغ

طبعاً انا مسوى clearField تعمل كالتالي :

public void clearField(){

textField1=" ";

textField2=" ";

radioButton1.setSelected(false);

radioButton2.setSelected(false);

}

مع الـ text field ما طلع عندي مشكلة يطلع عندي المربع فاضي

بس مع radio button لا زال يحتفظ بآخر وضعية له . الشي هذا ممكن يعمل أخطاء في الادخال أثناء التشغيل اذا نسي المستخدم تغيير وضعية radio Button الصحيحة

طبعا radioButton1 و radioButton2 تنتمي لنفس المجموعة

افيدونا جزاكم الله خير

وشكرا للجميع

#6

آآآ هاااا الآن فهمت عليك.

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

إذا كان عندك إثنان RadioButton تستطيع إنشاء RadioButton ثالث، ولكن مخفي أي setVisible(false) وعند ضغط المستخدم لزر Next تقوم باختيار هذا الـ RadioButton عن طريق الطريقة setSelected، وهكذا تكون قد ألغيت اختيار الـ RadioButton الاثنان الأساسيان الظاهران على الشاشة، ثم تقوم باختبار كون هذا الزر الأخير مختار أم لا لتعطي المستخدم رسالة الخطأ المناسبة.

وآمل أن تجد طريقة أنسب من هذه لحل المشكلة.

تم تعديل هذه المشاركة بواسطة MMSs في 28 نوفمبر 2005 في 04:33

#7

ماشاء الله تبارك الله

حل يدل حقيقة على ذكاء في الوصول للتنيجة المطلوبة بغض النظر عن الطريقة

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

وليس فقط النتيجة النهائية

اكرر شكري لك يا اخي

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

#8

همممم.... حسب قراءتي القديمة والله أعلم... أظن أن هذه الطريقة هي المقترحة من صن..

بالتوفيق!

#9

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

قد اكون متأخرا؛ ولكن الموضوع شدني.

المتحكم الرئسي في هذه العملية هو ButtonGroup فهو الذي يقوم باختيار عنصر اذا لم يكن هناك اي عنصر للاختيار.

ال ButtonGroup لديه عملية add وهي تأخذ AbstractButton. وهو في حالتنا هذه 2 RadioButtons .

عندما نقوم بعملية setSelected فان ال AbstractButton يقوم بالتالي:

public void setSelected(boolean b) {
        boolean oldValue = isSelected();

        // TIGER - 4840653
        // Removed code which fired an AccessibleState.SELECTED
        // PropertyChangeEvent since this resulted in two
        // identical events being fired since
        // AbstractButton.fireItemStateChanged also fires the
        // same event. This caused screen readers to speak the
        // name of the item twice.

        model.setSelected(b);
    }

اي ان المسئول عن العملية هو ال model الموجود داخل هذه العملية.

هذا ال model هو من نوع ButtonModel ؛؛

بامكاننا القيام بانشاء ButtonModel مخصص لحالتنا هذه وثم بعد ذلك؛ قبل اضافة ال RadioButton نقوم بالتالي:

radioButton1.setModel(new ArabTeamButtonModel();

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#10

اخي الكريم فيصل

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

في البداية كنت مركز معاك و فاهم عليك تمام بس في الاخير بصراحة تلخبطت

ياليت تضيف مشكوراً كود كامل لتوضيح الفكرة

#11

صحيح اضافة كود يمكن تساعدنا على مساعدتك

#12

هذا حل،، نشكر أخي فيصل الردادي على أفكاره الإبداعية...

1- فكرة الأخ MMSs هي الفكرة المقترحة من صن نفسها. وبصراحة لا تعجبني! تستطيع قراءة اقتراح صن من هنا:

javax.swing.ButtonGroup Documentation

2- فكرة أخي فيصل تقوم على فكرة صناعة ButtonModel جديد يناسب احتياجنا، لكني نظرت إلى الموضوع من طريق آخر وهو أن نطور ButtonGroup مناسب لاحتياجنا.

حاولت كثيرا تطوير ButtonGroup بعمل extends لها، لكني واجهت صعوبة في التحكم ببعض المتغيرات ولا سيما أن الحقل selection كان package وليس public أو protected،، مما اضطرني إلى إعادة بناء الفئة بعد وراثتها! وبصراحة أتهم صن لسوء بناء هذه الفئة..

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

حمل الفئة من الملف المرفق، واعمل ترجمة للملف واستخدمه في برنامجك هكذا وقل لي كيف ترى النتائج!

import hussam.faisal.swing.*;

//code

ButtonGroup myGroup = new ArabTeamButtonGroup();
myGroup.add(radio1);
myGroup.add(radio2);
//افعل ما تريد!!

باستعمال هذه الفئة ، تستطيع مسح الاختيار إن أردت، وتجعل المستخدم يمسح اختياره إن أراد ذلك!!

أرجو أن تجربوا الفئة وتخبروني بالنتائج فأنا لم أجربها بكاملها..

ربما في المستقبل يقوم أحد بتطوير نفس الأمر باستخدام ButtonModel!

مع الشكر لفكرة أخي فيصل!

بالتوفيق!

ArabTeamButtonGroup.java.txt

#13

لم أكن أعرف أني أفكر بطريقة Sun ، بصراحة ازداد إعجابي بنفسي عندما قرأت التوثيق الخاص بـ Sun :D :D ، هذه مزحة طبعاً :)

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

#14

أما انا فإزداد إعجابي بكم و بهذا المنتدى الرائع

واقترح ان يكون شعار المنتدى هو " لكل مشكلة حل " أو بالأصح " لكل مشكلة اكثر من حل "

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

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

وفقكم الله و زدكم علماً

#15

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

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

   	 if(!b){
      selection=null;
      return;
   	 }

إن الحقل selection يحوي الـ RadioButton الذي تم اختياره أخيراً، لذلك من المفروض بحسب وجهة نظرك أنه إذا حوى القيمة null فإنه لن يحوي مؤشر إلى أي زر آخر، وهكذا تكون ألغيت الاختيار، وهذا الكلام صحيح 100%، ولكنه ناقص، فأنت لم تعطي القيمة false للـ ButtonModel للزر الذي ألغيت اختياره وبذلك سوف يبقى مختار. وبما أن selection يحوي null فعند القيام باختيار زر آخر لن يقوم بإزالة الاختيار عن الزر السابق، وهكذا سوف يظهر اثنان RadioButton تم اختيارهما معاً.

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

      if (!b && m != null && m == selection) {
        ButtonModel oldSelection = selection;
        selection = null;
        if (oldSelection != null) {
          oldSelection.setSelected(false);
        }
        m.setSelected(false);
        return;
      }

طبعاً يمكن إضافة هذه الشيفرة إلى الطريقة setSelected ضمن الصف ArabTeamButtonGroup أو يمكن إضافة طريقة جديدة إلى الصف ArabTeamButtonGroup :

    public void deselectAll() {
      ButtonModel oldSelection = selection;
      selection = null;
      if (oldSelection != null) {
        oldSelection.setSelected(false);
      }

هذا هو الحل النهائي. أتمنى الفائدة للجميع.

وهذا هنا الصف ArabTeamButtonGroup، استخدمه بدلاً من ButtonGroup كما أشار أخي أبو مازن.

ArabTeamButtonGroup.java.txt

#16

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

هذه بعض النقاط التي فهمتها من تصميم صن للفئتين ButtonModel و ButtonGroup: وهي

1- ButtonGroup: إذا وفقط إذا اختير اختيار جديد، يقوم ButtonGroup بإطفاء اختيار القديم! وهذا عمله فقط! حسب فهمي، فهو لا يفعل شيئا إذا جاءه خبر أن زر قد ذهب اختياره!

2- ButtonModel هو الذي يستقبل الأخبار ويرسلها إلى ButtonGroup، إذا أرسل إشارة true فعل ButtonGroup ما يلزم لإطفاء الاختيار القديم، أما إذا أرسل إشارة false، فإن ButtonGroup لا يفعل شيئا!

عموما لا أدري إن كنت وضحت وجهة نظري أو فهمي للموضوع،، لكن شفرتي حسب اختباري اشتغلت جيدا!، وشفرتك عملت بشكل ممتاز أيضا!

أرجو أن تجرب اختباري وأن ترفق اختبارك حتى أرى الخطأ،،، وأشكرك مجددا على إصلاح الشفرة وعلى هذا التفاعل البناء!!

ButtonTest.java.txt

#17

شكراً لك أيضاً أخي أبو مازن على تفاعلك.

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

حتى تختبر نتائج التعديل على setSelected الخاصة بك، شغل البرنامج ثم اختر R1 ثم اضغط على Deselect R1 تلاحظ من ذلك أن الشيفرة تعمل بشكل جيد، ولكن اختر الزر R2 أو R3، ثم اضغط على زر إلغاء الاختيار Deselect R1 طبعاً بما أن شيفرة حدث الضغط على الزر تلغي اختيار R1 فقط لذلك لن تلغي اختيار أياً من الزرين الآخرين فهذا أمر طبيعي، ولكنها قد جعلت الحقل selection في الصف ArabTeamGroupButton يحوي null لذلك عندما تنقر على زر آخر غير الذي اخترته قبل قليل فسوف تقوم باختياره مع الزر السابق أي لن تزيل اختيار الزر السابق، وهذه هي المشكلة.

ثم عد فعدل نمط الحقل g إلى الصف ArabTeamGroupButton الآخر، ولاحظ كيف حلت هذه المشكلة.

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

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

ButtonTest.java.txt

#18

فنان ،، الآن فهمت،، بارك الله فيك،،

المثال كان واضح،، وقد حررت الاختبار في المرفق أيضا ليتضح الخطأ أكثر...

شكرا على إصلاح الخطأ،، لكني لم أفهم قصدك هنا بالضبط:

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

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

ButtonTest.java.txt

تم تعديل هذه المشاركة بواسطة أبومازن في 4 ديسمبر 2005 في 14:45

#19

الحق معك، أنا أيضاً في كثير من الأحيان، وخاصة عندما ألعاب بالـ Security في Windows، أحب أن ألغي اختيار Radio تماماً حتى يظهر وكأني لم أختر شيء.

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

وهذا على كل الأحوال منطق RadioButton في هندسة البرمجيات، وإذا كنت تريد من المستخدم اختيار أحد الأزرار وتريد أن تعطيه أيضاً إمكانية إلغاء اختياره تستخدم الـ CheckBox، وكمثال عن هذه الطريقة؛ إذا كنت تستخدم Windows XP افتح خصائص أي ملف موجود على جزء من الهارد بنظام ملفات NTFS، ثم ضمن التبويب General اضغط على الزر Advanced لترى المربع التالي:

04_12_05_08_02_46_1133712166AdvAttrib.GIF

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

وأعتقد أن القيام بمثل هذا سهل في Java، فقط استخدم JCheckBox بدلاً من JRadioButton مع ButtonGroup.

تم تعديل هذه المشاركة بواسطة MMSs في 4 ديسمبر 2005 في 18:58

#20

معك،، لكن السؤال هل من السهل أن نجعل JCheckBox واحدة هي التي true؟ لكن عموما أرى أن فئتك تقوم بما يريد المستخدم عادة،، يعني مثلا أنا لا أدري ماذا أختار، وأقصد بذلك أن ينفذ الحاسب ما يراه مناسبا..

أظنني لو صنعت برنامجا معينا لاستخدمت فئتك ArabTeamButtonGroup عوضا عن ButtonGroup !!

ربما في النهاية هي ذوق المستخدم،!

#21

حسناً، بالتجربة اكتشفت أنك تستطيع استخدام JCheckBox مع ArabTeamButtonGroup بالطريقة setSelected المعدلة بكل سهولة ولكن ليس مع ButtonGroup، والمثال المرفق يوضح ذلك.

وأرى من أجل هذه الحالة أن يكون هناك صفان من ArabTeamButtonGroup واحد بطريقة setSelected معدلة من أجل استخدامها مع JCheckBox وآخر بدون تعديل setSelected ولكن بإضافة الطريقة deselectAll من أجل استخدامها مع JRadioButton.

وسوف أرفق هذين الصفين في المشاركة التالية -إن شاء الله- مع بعض التعديلات التحسينية.

اقتباس
يعني مثلا أنا لا أدري ماذا أختار، وأقصد بذلك أن ينفذ الحاسب ما يراه مناسبا..

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

وأعتذر منك على الإطالة.

ButtonTest.java.txt

#22

أتممت بحمد الله تصميم صفان مشتقان من ButtonGroup بالاسم JRadioButtonGroup وJCheckBoxGroup من أجل استخدماهم مع JRadioButton وJCheckBox كما هو واضح من أسمائهم.

الصف JRadioButtonGroup هو نفس الصف المطور سابقاً ArabTeamButtonGroup باستثناء إعادة الطريقة setSelected إلى أصلها في الصف ButtonGroup من أجل تلافي الخطأ الذي حصل، والبقاء على الطريقة المستحدثة بالاسم deselectAll من أجل إلغاء اختيار أي زر Radio تم اختياره، حيث لا بد من اختيار زر واحد فقط، وقد حصرت عملية إلغاء الاختيار بهذه الطريقة حتى يتم استدعاءها برمجياً حصرياً ولا يتمكن المستخدم النهائي من الوصول إليها بالواجهات المرئية.

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

كل ذلك موضح في المثال المرفق، أتمنى أن تختبروه وتزيدوني باقتراحاتكم حتى يكون هذان الصفان بديلان جيدان للصف الأساسي ButtonGroup.

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

JRadioButtonGroup.java.txt

JCheckBoxGroup.java.txt

ButtonTest.java.txt

groups.zip

تم تعديل هذه المشاركة بواسطة MMSs في 6 ديسمبر 2005 في 09:55

#23

ألاحظ أن الفئة الوارثة JCheckBoxGroup كررت شفرات كثيرة كان ينبغي أن تستخدم الشفرة الموجودة في JRadioButtonGroup!

#24

في الواقع هذا ليس تكراراً، إنما هو أمر لا بد منه، وهذا بسبب اختلاف بنية الحقل selection، فقد تغير بسبب التحسينات الحاصلة على JCheckBoxGroup من النمط ButtonModel إلى ArrayList تحوي عدة ButtonModel.

هذا الموضوع مغلق.

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