سؤال

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

الذي سيكون الحل أكثر ملاءمة؟

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

المحلول

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

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

لاحظ أنك لا تضطر بدقة إلى تمديد java.util.Observable - يمكنك تنفيذ نمط التصميم دون القيام بذلك.

نصائح أخرى

ال Observable نادرا ما يستخدم التنفيذ في جافا، ولا يعترض العمل جيدا مع التأرجح. استخدام an. EventListener في حين أن.

على وجه الخصوص، هل هناك سبب لعدم تمديده AbstractListModel أو حتى استخدام DefaultListModel مباشرة عند إدارة محتويات القائمة "في أي مكان آخر في واجهة المستخدم الرسومية"؟ ثم مربع التحرير والسرد الخاص بك يمكن أن تستخدم ComboBoxModel أن المندوبين إلى نفسه ListModel مثيل، إضافة تنفيذها الخاص لتتبع حالة الاختيار.

لدي في الاعتبار شيئا مثل هذا (لكنني لم أقم باختباره):

final class MyComboBoxModel 
  extends AbstractListModel 
  implements ComboBoxModel 
{

  private final ListModel data;

  private volatile Object selection;

  MyComboBoxModel(ListModel data) { 
    /* 
     * Construct this object with a reference to your list, 
     * which contents are managed somewhere else in the UI.
     */
    this.data = data;
    data.addListDataListener(new ListDataListener() {
      public void contentsChanged(ListDataEvent evt) { 
        fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
      }
      public void intervalAdded(ListDataEvent evt) { 
        fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
      }
      public void intervalRemoved(ListDataEvent evt) { 
        fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
      }
    });
  }

  public void setSelectedItem(Object selection) { 
    this.selection = selection;
    fireContentsChanged(this, 0, data.getSize() - 1);
  }

  public Object getSelectedItem() { return selection; }

  public int getSize() { return data.getSize(); }

  public Object getElementAt(int idx) { return data.getElementAt(idx); }

}

لماذا لا تستخدم الروابط؟

http://wiki.eclipse.org/index.php/jface_data_binding.

ربط واجهة المستخدم واجهة المستخدم الرسومية الخاصة بك إلى قائمتك. سوف تدقيق التغييرات بين الكائنتين بشفافية. تأكد من التفاف النموذج الخاص بك مع مراعاة مناسب، مثل Writablerist (إذا كان استخدام Arraylist مباشرة).

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

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

قم بإنشاء واجهة نموذج واجهة المستخدم الرسومية تحتوي على أسلوب Drawxarriaylist (مع X Conl Name NameLLLL. يحتوي على معلمات من نوع Arraylist

إنشاء فئة جديدة تسمى Guiview. يحتوي على طريقتين على الأقل: UpdateXarrayList، والتسجيل

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

عندما يقوم أي شيء في نموذج GUI الخاص بك بتحديث ArrayList هل استدعى UpdateXarrayList كآخر شيء يفعله. سيتم بعد ذلك بدء تشغيل طريقة UPDEXARYLIST في الفئة المنفذة Guiview إيقاف تشغيل DrawXarraylist مرة أخرى. سيتم بعد ذلك إيقاف تشغيل الرسائل في فئة النموذج في تنفيذ الخطوات الحاجة إلى تحديث عنصر التحكم في عرض قائمة الصفحات.

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

إذا كنت تستطيع إضافة جرة جديدة للتطبيق، تحقق من قوائم المزجج

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