كيفية معرفة المثيل عند إكمال تغيير حجم المكون

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

  •  16-09-2019
  •  | 
  •  

سؤال

في طلبي أحضر البيانات إذا تم تغيير حجم المكون. أريد أن أؤخر جلب حتى يكمل المستخدم تغيير حجم العملية. ComponentListener حدث componentResized حرائق في كل مرة يتم تغيير حجم النافذة.

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

المحلول

أود أن أقول أنك تكتب بالفعل تطبيق رسم الخرائط من نوع ما؟ :-)

يمكنك استخدام فئة الموقت Swing To Wait حتى يتم تمرير كمية محددة من الوقت دون أي أحداث. إليك الرمز:

/** Time to wait */
private final int DELAY = 1000;
/** Waiting timer */
private javax.swing.Timer waitingTimer;

/**
 * Handle resize event.
 */
public void componentResized(ComponentEvent e) 
{
  if (this.waitingTimer==null)
  {
    /* Start waiting for DELAY to elapse. */
    this.waitingTimer = new Timer(DELAY,this);
    this.waitingTimer.start();
  }
  else
  {
    /* Event came too soon, swallow it by resetting the timer.. */
    this.waitingTimer.restart();
  }
}

/** 
 * Actual resize method
 */
public void applyResize()
{
  //...
}

/**
 * Handle waitingTimer event 
 */
public void actionPerformed(ActionEvent ae)
{
  /* Timer finished? */
  if (ae.getSource()==this.waitingTimer)
  {
    /* Stop timer */
    this.waitingTimer.stop();
    this.waitingTimer = null;
    /* Resize */
    this.applyResize();
  }
}

نصائح أخرى

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

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

بعض التطبيقات فعل أداء io نتيجة التحجيم. يمكن ل Google Reader، على سبيل المثال، تحميل المشاركات القديمة من تغذية RSS كنتيجة لتحريك SCROLLBAR على نافذة المتصفح. هذه ميزة رائعة، وتؤدي إلى الحاجة إلى زر تحميل واضح، ولكنه مدفوع مباشرة من قبل المستخدم يبحث عن المشاركات القديمة؛ عمل واع، وليس فاقد الوعي.

أعتقد أن وجهة نظري هي أنك بحاجة إلى أن تكون حذرا للغاية حول كيفية عملك هذا العمل. معاقبة المستخدم بتشغيل بطيء IO الذي يجعلهم ينتظرون ببساطة لأنهم تجرؤوا على تغيير حجم النافذة ليس نهجا سهل الاستخدام!

تعطي القليل من المعلومات الثمينة في سؤالك حول ما يبدو عليه UI، أو ما هو المكون أو كيف يتم تغيير حجمه - حتى، حيث تقوم بتحميل البيانات من، لذلك من الصعب الإجابة. فيما يلي بضع اقتراحات: آمل أن يساعدوا.

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

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

3. السماح بوقت معقول لتمرير تغيير الحجم للتوقف
يبدأ حدث تغيير الحجم الأول مؤقتا مع العد التنازلي 1 ثانية. أي أحداث تغيير حجم لاحقة إعادة تعيين العد التنازلي الأول. في مرحلة ما، سيكون هناك حدث تغيير حجم نهائي بعد أي أحداث تغيير الحجم لاحقة إعادة تعيين العد التنازلي، بحيث يسمح بتنتهي صلاحيته. في هذه المرحلة، يقوم الموقت بتحميلك لك.

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

هذا غير ممكن. ولكن يمكنك استخدام singleworkerthread. إلى الحد الأدنى لعدد الأحداث المعالجة.

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