سؤال

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

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

أي نصيحة ستكون موضع تقدير كبير!


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

لقد اقترحت العمل مع Getters and Setters ، لكن للأسف ليس لدي أي فكرة عن كيفية تنفيذها في فئة Swingworker.

جربته مثل هذا:

public void setSize(long totalSize) {
     this.totalSize = totalSize;
}
public long getTotalSize() {
     return totalSize;
}

تم استدعاء Setter في نهاية doInBackground() طريقة. للأسف لا يمكنني استخدام get() طريقة من واجهة المستخدم الرسومية.

final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
    public void run() {
        // do something with w.get()
    }
};
w.setRunnable(r);
w.execute();

لا يعمل إنشاء كائن "W" في حالتي لأن المُنشئ يتطلب كائنًا من الجري. هل فاتني شيء؟ يرجى الذهاب بسهولة علي ، إنها المرة الأولى التي أعمل فيها مع Swingworker. :) مرة أخرى ، شكرا جزيلا لك لمساعدتكم!

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

المحلول

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

public class MySwingWorker extends SwingWorker {

   private final Runnable r;
   public MySwingWorker(Runnable r) {
       this.r = r;
   }
   public void doInBackground() {...}
   public void done() { r.run(); }
 }

الآن من واجهة المستخدم الرسومية ، قد تفعل شيئًا مثل

Runnable updateLabel = new Runnable() {
       public void run() {
           label.setText("myValue");
       }
};
SwingWorker w = new MySwingWorker(updateLabel);
w.execute();

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

final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
    public void run() {
        // do something with w.get()
    }
};
w.setRunnable(r);
w.execute();

في كلتا الحالتين ، يعمل Runnable بشكل مشابه للإغلاق الذي يتم تنفيذه عند الانتهاء من العامل.

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