Java 中 SwingUtilities 类的重要性是什么?

awtjavaobject oriented programmingprogrammingswing

在 Java 中,当 Swing 组件显示在屏幕上后,它们只能由一个名为事件处理线程的线程进行操作。我们可以将代码写在一个单独的块中,并将此块引用给事件处理线程线程SwingUtilities  类有两个重要的静态方法,invokeAndWait()invokeLater(),用于将对代码块的引用放入 event queue

语法

public static voidinvokeAndWait(Runnable doRun) throws InterruptedException, InvocationTargetException
public static voidinvokeLater(Runnable doRun)

参数 doRun  是对 Runnable  接口实例的引用。在这种情况下,Runnable  接口不会传递给线程的构造函数。 Runnable 接口只是用作识别事件线程入口点的一种手段。正如新生成的线程将调用 run() 一样,事件线程在处理完队列中所有其他待处理的事件后也将调用  run() 方法 。如果调用 invokeAndWait()invokeLater() 的线程在目标引用的代码块完成之前被中断,则会抛出 InterruptedException。如果 run() 方法内的代码抛出未捕获的异常,则会抛出 InvocationTargetException

示例

import javax.swing.*;
import java.lang.reflect.InvocationTargetException;
public class SwingUtilitiesTest {
   public static void main(String[] args) {
      final JButton button = new JButton("Not Changed");
      JPanel panel = new JPanel();
      panel.add(button);
      JFrame f = new JFrame("InvokeAndWaitMain");
      f.setContentPane(panel);
      f.setSize(300, 100);
      f.setVisible(true);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      System.out.println(Thread.currentThread().getName()+" is going into sleep for 3 seconds");
      try {
         Thread.sleep(3000);
      } catch(Exception e){ }
      //Preparing code for label change
      Runnable r = new Runnable() {
         @Override
         public void run() {
            System.out.println(Thread.currentThread().getName()+"is going into sleep for 10 seconds");
            try {
               Thread.sleep(10000);
            } catch(Exception e){ }
          button.setText("Button Text Changed by "+ Thread.currentThread().getName());
          System.out.println("Button changes ended");
      }
    };
      System.out.println("Component changes put on the event thread by main thread");
          try {
            SwingUtilities.invokeAndWait(r);
         } catch (InvocationTargetException | InterruptedException e) {
            e.printStackTrace();
         }
      System.out.println("Main thread reached end");
   }
}

输出


相关文章