ใน Java หลังจากที่ส่วนประกอบการสวิงแสดงบนหน้าจอ พวกเขาสามารถใช้งานได้เพียงเธรดเดียวที่เรียกว่า เธรดการจัดการเหตุการณ์ . เราสามารถเขียนโค้ดของเราในบล็อกที่แยกจากกัน และสามารถให้การอ้างอิงบล็อกนี้กับ เหตุการณ์ การจัดการ กระทู้ . SwingUtilities คลาสมีวิธีการคงที่ที่สำคัญสองวิธี invokeAndWait() และ invokeLater() เพื่อใช้อ้างอิงถึงบล็อคของโค้ดบน เหตุการณ์ คิว .
ไวยากรณ์
โมฆะคงที่สาธารณะ invokeAndWait (Runnable doRun) พ่น InterruptedException, InvocationTargetException โมฆะคงที่สาธารณะ invokeLater(Runnable doRun)
พารามิเตอร์ doRun เป็นการอ้างอิงถึงอินสแตนซ์ของ Runnable อินเตอร์เฟซ. ในกรณีนี้ รันได้ อินเทอร์เฟซจะไม่ถูกส่งไปยังผู้สร้างของเธรด วิ่งได้ อินเทอร์เฟซถูกใช้เป็นเครื่องมือในการระบุจุดเริ่มต้นสำหรับเธรดเหตุการณ์ เช่นเดียวกับเธรดที่วางไข่ใหม่จะเรียกใช้ run() , เธรดเหตุการณ์จะเรียกใช้ run() วิธีการ เมื่อประมวลผลเหตุการณ์อื่นๆ ทั้งหมดที่ค้างอยู่ในคิว InterruptedException จะถูกส่งออกไปหากเธรดที่เรียก invokeAndWait() หรือ invokeLater() ฉัน ถูกขัดจังหวะก่อนที่บล็อกของรหัสที่อ้างอิงถึงโดยเป้าหมายจะเสร็จสมบูรณ์ InvocationTargetException ถูกส่งออกไปหากเกิดข้อยกเว้นที่ไม่ถูกตรวจจับโดยรหัสภายใน run() วิธีการ
ตัวอย่าง
<ก่อนหน้า>นำเข้า javax.swing.*; นำเข้า java.lang.reflect.InvocationTargetException คลาสสาธารณะ SwingUtilitiesTest { โมฆะสาธารณะหลัก (สตริง [] args) { ปุ่ม JButton สุดท้าย =JButton ใหม่ ("ไม่เปลี่ยนแปลง"); แผง JPanel =JPanel ใหม่ (); แผงเพิ่ม (ปุ่ม); JFrame f =ใหม่ JFrame ("InvokeAndWaitMain"); f.setContentPane (แผง); f.setSize(300, 100); f.setVisible(จริง); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); System.out.println(Thread.currentThread().getName()+" กำลังเข้าสู่โหมดสลีปเป็นเวลา 3 วินาที"); ลอง { Thread.sleep(3000); } catch (ข้อยกเว้น e) { } // กำลังเตรียมรหัสสำหรับการเปลี่ยนป้ายกำกับ Runnable r =new Runnable () { @Override public void run () { System.out.println (Thread.currentThread ().getName () +" กำลังดำเนินการ เข้าสู่โหมดสลีปเป็นเวลา 10 วินาที"); ลอง { Thread.sleep(10000); } catch(ข้อยกเว้น e){ } button.setText("ข้อความของปุ่มเปลี่ยนโดย "+ Thread.currentThread().getName()); System.out.println("การเปลี่ยนแปลงปุ่มสิ้นสุดลง"); } }; System.out.println("การเปลี่ยนแปลงคอมโพเนนต์ที่ใส่ในเธรดเหตุการณ์ตามเธรดหลัก"); ลอง { SwingUtilities.invokeAndWait(r); } จับ (InvocationTargetException | InterruptedException จ) { e.printStackTrace (); } System.out.println("เธรดหลักสิ้นสุดแล้ว"); }}ผลลัพธ์