ITEEDU

swing的版面结构

版面管理器

事件处理

鼠标事件

键盘事件处理

窗口与面板的使用

JInternalFrame的使用(窗口与面板)

JTabbedPane,JScroolPane,JScrolBa的使用

标签与按钮的使用与介绍

[复选框、选项按钮、列表方框、下拉式列表的使用与介绍]

表格(Table)的使用与介绍

JTable的事件处理

1文字输入组件的使用与介绍

树(Tree)的使用与介绍

对话框(Option Pane与Dialog)的使用与介绍

菜单与工具栏的使用与介绍

文件选择对话框,颜色选择对话框,分隔线的使用与介绍.

Slider,Timer,Progress的使用

14-2:使用Timer组件:

java.lang.Object --javax.swing.Timer

使用Timer组件可以让你在一段时间内依次做出你指定的操作,这在动画的展示上非常有用。如果你有用过如ACDsee这类的看图 软件,你可以发现这类软件都会提供一种功能,那就是自动换图的功能,而且也可以让你设置换图时间间隔的长短。在java中, swing的Timer组件就可以让你做到这样的功能,而且非常容易使用,下面我们先来看Timer的构造函数。

Timer构造函数:

Timer(int delay,ActionListener listener):建立一个Timer组件,并在每一次delay的时间点上触发ActionEvent. 使用Timer组件它会在根据你所给予的delay时间,周期性的触发ActionEvent事件,如果你要处理这个事件,你必须实作 ActionListener界面所定义的actionPerformed()方法。要开始激活Timer组件,你可以用start()方法,要停止Timer组件可以使用 stop()方法,要从新激活Timer组件可以使用restart()方法,若只想Timer组件只触发一次ActionEvent事件,可利用 setRepeats(false)方法,将参数设为false,若要设置delay时间则可用setDelay()方法。

事实上使用Timer组件表示在程序背后是利用Threads在运行Timer的工作,因此你当然也可以利用Thread的功能来自行制造出这 样的效果,不过这不在本书的讨论范围内,下面的范例我们实作一个显示图程序,可让用户调整显示图时间的快慢。

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.*;

public class TimerDemo1 implements ActionListener, ChangeListener {
	JFrame f = null;
	ImageIcon[] icons;
	JSlider slider1;
	JLabel label;
	JToggleButton toggleb1, toggleb2;
	JButton b;
	javax.swing.Timer timer;
	int index = 0;

	public TimerDemo1() {
		f = new JFrame("Timer Example");
		Container contentPane = f.getContentPane();
		icons = new ImageIcon[5];
		for (int i = 0; i < 5; i++)
			icons[i] = new ImageIcon(".\\icons\\" + (i + 1) + ".jpg");

		label = new JLabel(icons[0]);
		JPanel panel1 = new JPanel();
		panel1.setLayout(new GridLayout(2, 1));
		slider1 = new JSlider();
		slider1.setPaintTicks(true);
		slider1.setMajorTickSpacing(20);
		slider1.setMinorTickSpacing(10);
		slider1.setPaintLabels(true);
		slider1.addChangeListener(this);
		panel1.add(slider1);

		JPanel buttonPanel = new JPanel();
		buttonPanel.setLayout(new GridLayout(1, 3));
		toggleb1 = new JToggleButton("Start");
		toggleb1.addActionListener(this);
		buttonPanel.add(toggleb1);
		b = new JButton("Restart");
		b.addActionListener(this);
		buttonPanel.add(b);
		toggleb2 = new JToggleButton("Don't Repeat");
		toggleb2.addActionListener(this);
		buttonPanel.add(toggleb2);
		panel1.add(buttonPanel);

		Hashtable table = new Hashtable();
		table.put(new Integer(0), new JLabel("е"));
		table.put(new Integer(50), new JLabel("い"));
		table.put(new Integer(100), new JLabel("篊"));
		slider1.setLabelTable(table);
		/*
		 * 由于java的Timer组件有两种,一种是javax.swing.Timer,一种是java.util.Timer,若我们在程序中import了这两种
		 * package,则系统将不晓得到底要产生哪种Timer组件,就如同本范例一般,因此我们必须在new Timer组件的同时,指
		 * 定要new出哪一种类型的Timer组件。因此我们必须在new Timer组件的同时,指定要new出哪一种类型的Timer组件,在
		 * 此我们当然是要产生Swing的Timer组件,在此我们当然是要产生Swing的Timer组件。
		 */
		timer = new javax.swing.Timer(slider1.getValue() * 10, this);

		contentPane.add(label, BorderLayout.CENTER);
		contentPane.add(panel1, BorderLayout.SOUTH);

		f.pack();
		f.setVisible(true);

		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	public static void main(String[] args) {
		new TimerDemo1();
	}

	// 处理按钮事件与Timer事件。
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == toggleb1) {// 当用户按下"start"按钮时,Timer开始运行,且"Start"按钮会变成"Stop",若用户再次按下"stop"按钮,则Timer暂停
			// 运行,且"stop"按钮变成"start".
			if (e.getActionCommand().equals("Start")) {
				timer.start();
				toggleb1.setText("Stop");
			}
			if (e.getActionCommand().equals("Stop")) {
				timer.stop();
				toggleb1.setText("Start");
			}
		}
		// 当用户按下"Don't Repeat"按钮时,则Timer事件只触发一次,若再按一次"Don't Repeat"按钮,则Timer继续运行。
		if (e.getSource() == toggleb2) {
			if (timer.isRepeats()) {
				timer.setRepeats(false);
			} else {
				timer.setRepeats(true);
				timer.start();
			}
		}
		// 当用户按下"Restart"按钮时,则Timer组件的delay值恢复成初如值,并重新运行Timer.
		if (e.getSource() == b) {
			slider1.setValue(50);
			timer.restart();
		}
		// 处理Timer产生的ActionEvent事件,每次时间一到delay所设置的时间,label上的图片就会更换一次。
		if (e.getSource() == timer) {
			if (index == 5)
				index = 0;
			label.setIcon(icons[index]);
			label.repaint();
			// f.pack(); //若要窗口随图形大小变化,可加入此行.
			index++;
		}
	}

	// 处理slider所产生的ChangeEvent事件,当用户移动slider1的滑动杆时,等于从新设置Timer的delay时间。
	public void stateChanged(ChangeEvent e1) {
		timer.setDelay(slider1.getValue() * 10);
	}
}