程序员开发实例大全宝库

网站首页 > 编程文章 正文

java 核心技术-12版 卷Ⅰ- 6.1.7 接口与回调

zazugpt 2024-08-21 04:04:32 编程文章 19 ℃ 0 评论

原文

6.1.7 接口与回调

回调(callback)是一种常见的程序设计模式。在这种模式中,可以指定某个特定事件发生时应该采取的动作。例如,点击一个按饥或选择某个菜单项时,你可能希望完成某个特定的动作。不过,由于目前还没有介绍如何实现用户界面,所以我们来考虑一种类似但更简单的情况。

在 java.swing 包中有一个 Timer 类,如果希望经过一定时间间隔就得到通知,Timer 类就很有用。例如,假如程序中有一个时钟,你可以请求每秒通知一次,以便更新时钟的表盘。构造定时器时,需要设置一个时间问隔,并告诉定时器经过这个时间间隔时要做些什么。

如何告诉定时器要做什么呢?在很多程序设计语言中,可以提供一个函数名,定时器要定期地调用这个函数。但是,Java 标准类库中的类采用了一种面向对象方法。你可以向定时器传人某个类的对象,然后,定时器调用这个对象的某个方法。由于对象可以携带额外的信息,所以传递一个对象比传递一个函数要灵活得多。

当然,定时器需要知道要调用哪一个方法。它要求你指定一个类的对象,这个类要实现java.awt.event 包的ActionListener 接口。下面是这个接口:

public interface ActionListener{
	void actionPerformed(ActionEvent event);
}

当达到指定的时间间隔时,定时器就调用 actionPerformed 方法。假设你希望每秒打印一条消息“At the tone,the time is...”,然后响一声,那么可以定义一个实现 ActionListener 接口的类,然后将想要执行的语何放在 actionPerformed 方法中。

class TimePrinter implements ActionListener{
	public void actionPerformed(ActionEvent event){
    
    	System.out.println("At the tone ,the time is "
           + Instant.ofEpochMilli(event.getWhen()) );
      Toolkit.getDefaultToolkit().beep();
    }
}

需要注意 actionPerformed 方法的ActionEvent 参数。这个参数提供了事件的相关信息,例如,发生这个事件的时间。event.getWhen() 调用会返回这个事件时间,表示为“纪元”(1970

年1月1日)以来的毫秒数。如果把它传人前态方法 Instant.ofEpochMilli,可以得到一个更可读的描述。

接下来,构造这个类的一个对象,并将它传递到 Timer 构造器。

?var listener = new TimePrinter();

?Timer t = new Timer(1000,listener);

?Timer 构造器的第一个参数是一个时间间隔 (单位是毫秒),即经过多长时间通知一次。这里希望每秒通知一次。第二个参数是监听器对象。最后,启动定时器:

t.start();

?每过 1秒就会显示下面的消息,然后响一声铃

At the tone,the time is 2017-12-16T05:01:49.550Z

警告:一定要导入javax.swing.Timer。另外还有一个稍有区别的 java,util.Timer 类。

程序清单 6-3 展示了定时器和动作监听器的具体使用。定时器启动以后,程序将弹出一个消息对话框,并等待用户点击 Ok 按钮来终止程序。在程序等待用户操作的同时,每秒显示一次当前的时间。(如果关闭这个对话框,一旦 main 方法退出,程序就终止。)

程序清单6-3 timer/TimerTest.java


package timer;

/**
   @version 1.02 2017-12-14
   @author Cay Horstmann
*/

import java.awt.*;
import java.awt.event.*;
import java.time.*;
import javax.swing.*;

public class TimerTest
{  
   public static void main(String[] args)
   {  
      var listener = new TimePrinter();

      // construct a timer that calls the listener once every second
      var timer = new Timer(1000, listener);
      timer.start();

      // keep program running until the user selects "OK"
      JOptionPane.showMessageDialog(null, "Quit program?");
      System.exit(0);
   }
}

class TimePrinter implements ActionListener
{  
   public void actionPerformed(ActionEvent event)
   {  
      System.out.println("At the tone, the time is " + Instant.ofEpochMilli(event.getWhen()));
      Toolkit.getDefaultToolkit().beep();
   }
}

javax.swing.JOptionPane1.2

  • static void showMessageDialog(Component parent, Object message) 显示一个对话框,包含一条提示消息和一个OK 按钮。这个对话框位于 parent 组件的中央。如果 parent 为 null,对话框将显示在屏幕的中央。

javax.swing.Timer 1.2

  • Timer(int interval, ActionListener listener) 构造一个定时器,每经过 interval 毫秒通知listener 一次。
  • void start() 启动定时器。,一旦启动,定时器将调用监听器的 actionPerformed。
  • void stop() 停止定时器。一旦停止,定时器将不再调用监听器的 actionPerformed。


java.awt.Toolkit 1.0

  • static Toolkit getDefaultToolkit() 获得默认的工具箱。工具箱包含有关 GUI环境的信息
  • void beep() 发出一声铃响。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表