سؤال

لقد نفذت مؤخرا Action أن تبديل الحالة الممكنة لوظيفة الأعمال. كلما استدعاء المستخدم الإجراء الذي قمت بتعيين علم منطقي: "ستمكن"لتحديد ما إذا كان الاحتجاج التالي سيمكن أو تعطيل الوظيفة. وبالمثل، أقوم بتحديث اسم الإجراء، وصف قصير ورمز لتعكس الحالة الجديدة. ثم داخل بلدي actionPerformed(...) الطريقة التي أتخذ إجراءات مختلفة بناء على حالة willEnable.

  1. هل هذا هو النهج الصحيح أو يمكن لأي شخص أن يوصي بشكل أفضل (كما أظن أن هذه مشكلة شائعة)؟ (أستطيع أن أرى ذلك JToggleButton يعمل كزر من دولتين ولكن أريد أن يكون هذا الإجراء مرئيا علىJMenuBar وكذلك JButton، لذلك لا أعتقد أن هذا مناسب).

تعديل

على وجه التحديد، كيف تعامل التطبيقات مثل الفكرة مع هذا؟ هل يستخدمون إجراءات متعددة الدول (على النحو الوارد أعلاه) أو سوف تبادلا مختلف Action في معين JButton استخدام setAction(Action)ب ربما هذا النهج هو أفضل؟

  1. عند تحديث خصائص الإجراء، يمكنني الاعتماد على مكونات واجهة المستخدم الرسومية تهيأت بهذا Action (على سبيل المثالJButton) إعادة طلاء نفسها تلقائيا؟ ماذا لو JButtonحجم التغييرات نتيجة لذلك؟ يجب أن أقطع المحتويةJPanel نفسي؟
  2. هو تغيير اسم العمل شيء سيء للقيام به؟ هذه هي الطريقة الوحيدة التي يمكنني إجراء تغيير النص jbutton، لكنني محزن بأن الاسم يجب أن يظل ثابتا إذا تم وضع الإجراء في ActionMap.

شكرا مقدما.

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

المحلول

أتوقع أن أي عنصر واجهة المستخدم الرسومية التي تم إنشاؤها مع بعض البيانات "نموذج" (أود أن أشمل Action كطراز بيانات) يجب أن يسجل نفسها كمستمع لهذا النموذج. هو - هي يجب تأخذ مناسبة، erm، العمل على PropertyChangeEvent يتم إطلاقه: أي سلوك آخر سيشكل علة في رأيي.

الشيء المشكوك فيه هنا هو ما إذا كان من المشروع تغيير اسم الإجراء؛ اعتقد انه انها ليست شرعية. وبعد عملك منطقيا هو toggleabledstatus. وهذا لا يتغير لأن الإجراء قد تم استدعاء. أي مكون يحتاج إلى عرض أي نص آخر يجب أن يسجل نفسه كممسكو Action ثم تحقق الخاص بك willEnable علم لأخذ العمل المناسب، erm، العمل.

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

نصائح أخرى

قد ترغب في إلقاء نظرة على نمط الدولة.

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

interface IState {
  void doAction();
  boolean isEnabled();
}

class EnabledState implement IState {
  void doAction() {
    setState(new DisabledState());
    // do something
  }
  boolean isEnabled() {return true;}
}

class DisabledState implement IState {
  void doAction() {
    setState(new EnabledState());
    // do nothing
  }
  boolean isEnabled() {return false;}
}

private IState state = new DisabledState(); // default is disabled
private PropertyChangeSupport support = new PropertyChangeSupport(this);

void setState(IState state) {
  if (this.state != state) {
    IState oldState = this.state;
    this.state = state;
    support.firePropertyChange("enabled", oldState.isEnabled(), state.isEnabled());
  }
}

void doAction() {
  state.doAction();
}

في حين أنه من النفقات العامة قليلا لطريقة واحدة، فإنه يؤكد بالتأكيد بمجرد أن يكون لديك العديد من الطرق التي تتغير سلوكها اعتمادا على حالة واحدة.

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