المواضيع: ما الذي يجعلهم مربكين؟ اثنان من Rundables مع مستمع الماوس

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

سؤال

لديّ Jwindow و jframe ، لقد صنعت كل من Runnable وتنفيذ مستمع الماوس. لدي الكثير من الاختبارات التي يجب القيام بها لمشروع لي وتبسيطه ، أود أن أكون قادرًا على أتمتة معظمه ، لذلك بدأت مسجل الماوس الخاص بي وعبادة (يستخدم فئة Java Robot).

كيندا مثل شيء مبسط أو شيء تلقائي ... لكنه سيتم تشغيله على جهاز Ubuntu الخاص بي كما لو كان Windows One !!!

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

أثناء إعادة التشغيل ، أريد أن أتمكن من الخروج من التطبيق بأكمله ، ولذا فإنني على الرغم من أن أفضل طريقة للقيام بذلك هي جعل JFrame و Jwindow Runable.

JFrame هو ببساطة لتقديم خيار قريب من التطبيق.

لذلك ، في صفي الرئيسي لدي

public static void Main(String[] args){
    recorder = new Recorder();
    gui = new GUI();
    Thread tr = new Thread(recorder);
    Thread tg = new Thread(gui);
    tr.setName("Recorder");
    tg.setName("GUI");
    tr.start();
    tg.start();
}

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

على دروس المسجل والرصاص واجهة المستخدم الرسومية.

public class Recorder
        implements Runnable, MouseListener {

//Constructor and other code

    public void mouseClicked(MouseEvent e) {

        if (e.getButton() == MouseEvent.BUTTON1) {
             //Record events
        }else{
             //Replay events
        }
        System.exit(0);
    }

    public void run() {
        System.out.println("Recorder");
    }
}

public class GUI 
    implements Runnable, MouseListener {

//Constructor, simply constructs JFrame and sets mouselistener to it

   public void mouseClicked(MouseEvent e) {
       System.exit(0);
   }

   public void run() {
        System.out.println("GUI");
   }

}

يطبع طربي مسجلًا ثم يسمح لي واجهة المستخدم الرسومية بتسجيل أحداثي ثم انقر بزر الماوس الأيمن على jwindow لإعادة تشغيلها ...

ولكن بعد ذلك ، عندما أنقر على زر إغلاق JFRAME أو حتى في الإطار بسبب مستمع الماوس ، لن يخرج حتى يتم إعادة تشغيل جميع الإجراءات بالكامل؟

شيء واحد كنت أتساءل هو ما أضعه في الجري هو ما الذي يحافظ على تشغيل الخيط؟ لذلك عندما system.out.println ("") ؛ هل تم تنفيذ الموضوع يموت؟ لذلك حاولت بعض الوقت من حولهم وطبع طلبي بنجاح

واجهة المستخدم الرسومية GUI GUI مسجل مسجل واجهة المستخدم الرسومية وغيرها

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

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

المحلول

انت مشوش Threads مع Objects. عندما يكون لديك Object هذا هو Runnable هذا يعطي فقط نقطة انطلاق لخيط. ومع ذلك ، هذا لا يعني أنه عندما يكون مؤشر ترابط آخر (في هذه الحالة ، يتولى مؤشر ترابط الحدث أن يتعامل مع MouseListener) يستدعي طريقة في Runnable أن ينفذها الخيط الذي ينفذ Runnable. عندما يتم استدعاء طريقة ، فإنه لا يتحول أبدًا إلى موضوع آخر. إذا كنت تريد هذا ، فأنت بحاجة إلى آلية. على سبيل المثال قائمة انتظار أن MouseListener يمكن نشر المهام إلى ، وفي الخاص بك Runnable.run() ثم تستمر في البحث عن مهمة جديدة.

نصائح أخرى

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

شاهد هذا البرنامج التعليمي لفهم أساسيات الخيوط المتعددة في سياق التأرجح. http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

الإجابة الفعلية على سؤالك هي في هذا الجزء من البرنامج التعليمي:

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/cancel.html

لكنني أقترح أن تمر عبر البرنامج التعليمي بأكمله.

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