يتأرجح:هل هناك طريقة للتمييز بين ItemEvent الذي سببه المستخدم والآخر الذي سببه التطبيق؟

StackOverflow https://stackoverflow.com/questions/176150

سؤال

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

على سبيل المثال، لنفترض أن لدي مربع تحرير وسرد، 'combo"وأنا أستمع إلى أحداث itemStateChanged باستخدام ItemListener الخاص بي،"listener'.عندما يقوم المستخدم بتغيير التحديد إلى العنصر 2 أو عندما أقوم بتنفيذ السطر (الرمز الكاذب):

combo.setSelection(2)

..يبدو أنني غير قادر على التمييز بين هذه الأحداث.

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

شكرًا!

هل كانت مفيدة؟

المحلول

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

class ApplicationDataModel {

    private Flag current = Flag.RW;

    public void setData(ApplicationData data) {
        current = Flag.RO;
        setDataImpl(data);
        notifyObservers();
        current = Flag.RW;
    }

    public void reaction(Event e) {
        if (flag = Flag.RO) return;
        ...
    }

}

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

نصائح أخرى

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

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

كن حذرا عند استخدام الأعلام.سيحدث الحدث itemStateChanged في Event Dispatch Thread، وهو مؤشر ترابط مختلف عن الذي قمت بتعيين حالة العلامة عليه.وهذا يعني أن استخدام العلم قد لا يكون موثوقًا بنسبة 100%.

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

وربما تكون هناك طريقة أفضل منذ جافا 6، ولكن هذه هي الطريقة أنا دائما كان يفعل ذلك ...

على [تحرير] : لوكما يشير ديفيد بها، سوف تحتاج إلى تعيين إشارة (وتحديث السرد) في EDT باستخدام SwingUtilities.invokeLater أو ما شابه ذلك (يجب القيام بذلك على أي حال، كما كنت تتغير تحكم UI)

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

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

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

واقتراحي:

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

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

User -- JComboBox -- ActionComboBoxModel -- DefaultComboBoxModel -- Application code
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top