ITEEDU

滑动杆(Slider),时间控制(Timer),进度元件(Progress)的使用与介绍:

14-1:使用JSlider组件:

JSlider的类层次结构图:

java.lang.Object --java.awt.COmponent --java.awt.Container --javax.swing.JComponent --javax.swing.JSlider

我们曾在前面提到JScrollBar这个组件,可以让用户决定拉曳时一次滚动的区域大小,并且可以得到目前滚动杆上的值,看起来JScrollBar好象可以当作这 种微调的组件.然而JScrollBar通常置于窗口的最右边或最下面,且常JScrollBar来使用,因此在外观上或 实际应用上并不适合当微调工具使用,不过不用担心,java提供了一个特别为微调设计的组件,那就是JSlider.JSlider不仅可以置于 面版的任何地方,也可以在JSlider上标上刻度与数字,既美观又实用,我们现在就来看如何使用JSlider吧.

JSlider的构造函数:
  • JSlider():建立一个水平的JSlider对象,刻度从0-100,初始刻度为50.
  • JSlider(BoundedRangeModel brm):使用默认模式建立一个水平的JSlider对象.
  • JSlider(int orientation):建立一个自定义方向的JSlider对象,刻度从0-100,初始刻度为50.
  • JSlider(int min,int max):建立一个水平的JSlider对象,自定义刻度,从min-max,初始刻度为50.
  • JSlider(int min, int max,int value):建立一个水平的JSlider的对象,自定义刻度与初始值.
  • JSlider(int orientation,int min,int max,int value):建立一个自定义方向,刻度与刻度初始值的JSlider对象.

要使用JSlider组件就不得不提到JSlider事件的处理.当用户在JSlider上滑动杆时,就会产生ChangeEvent事件,若我们要处理 ChangeEvent事件就必须实作ChangeListener界面,此界面定义了一个方法,那就是stateChanged().通常我们在这个方法上会取得或 置滑动杆的相关信息,例如滑动杆的延伸区(extent),最大最小值或滑动杆目前所在刻度等等.我们来看下一节所举的范例:

14-1-1:建立JSlider组件:

这个范例我们建立了3个JSlider组件,并对每个JSlider组件做相关的设置,例如设置方向,初始值,最大最小值,延伸区值(extent) 等.

import javax.swing.*;//ChangeEvent事件是属于Swing事件,若要处理此事件必须将import swing的event package进来.
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;

public class SliderDemo1 implements ChangeListener {
	JFrame f = null;
	JSlider slider1;
	JSlider slider2;
	JSlider slider3;
	JLabel label1;
	JLabel label2;
	JLabel label3;

	public SliderDemo1() {
		f = new JFrame("JSlider Example");
		Container contentPane = f.getContentPane();

		JPanel panel1 = new JPanel();
		panel1.setLayout(new GridLayout(2, 1));
		slider1 = new JSlider();// 建立一个默认的JSlider组件.
		label1 = new JLabel("目前刻度:" + slider1.getValue());
		panel1.add(label1);
		panel1.add(slider1);
		panel1.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createEtchedBorder(), "Slider 1", TitledBorder.LEFT,
				TitledBorder.TOP));

		JPanel panel2 = new JPanel();
		panel2.setLayout(new GridLayout(2, 1));
		/*
		 * 下面五行程序建立一个水平方向的JSlider组件,并设置其取大值,最小值,初始值与延伸区值,所谓的延伸区值我们在前面
		 * JScrollBar中也提到过,意思是限制JSlider刻度可变动的范围,也就是说延伸区就像是一个障碍区,是无法通行的.延伸区
		 * 设得越大,刻度可变动的范围就越小
		 * .例如若minimum值设为0,maximan值设为100,而extent值设为0,则JSlider刻度可变动
		 * 的区域大小为100-50-0=50刻度(从0-50).
		 */
		slider2 = new JSlider(JSlider.HORIZONTAL);
		slider2.setMinimum(0);
		slider2.setMaximum(100);
		slider2.setValue(30);
		slider2.setExtent(50);
		label2 = new JLabel("目前刻度:" + slider2.getValue());
		panel2.add(label2);
		panel2.add(slider2);
		panel2.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createEtchedBorder(), "Slider 2", TitledBorder.LEFT,
				TitledBorder.TOP));

		JPanel panel3 = new JPanel();
		panel3.setLayout(new GridLayout(2, 1));
		// 下面两行建立一个具有最大最小值的JSlider组件,并设置此JSlider组件为垂直方向.
		slider3 = new JSlider(20, 80);
		slider3.setOrientation(JSlider.VERTICAL);
		label3 = new JLabel("目前刻度:" + slider3.getValue());
		panel3.add(label3);
		panel3.add(slider3);
		panel3.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createEtchedBorder(), "Slider 3", TitledBorder.LEFT,
				TitledBorder.TOP));

		slider1.addChangeListener(this);
		slider2.addChangeListener(this);
		slider3.addChangeListener(this);

		panel1.setPreferredSize(new Dimension(300, 100));
		panel2.setPreferredSize(new Dimension(300, 100));
		panel3.setPreferredSize(new Dimension(150, 200));

		GridBagConstraints c;
		int gridx, gridy, gridwidth, gridheight, anchor, fill, ipadx, ipady;
		double weightx, weighty;
		Insets inset;

		GridBagLayout gridbag = new GridBagLayout();
		contentPane.setLayout(gridbag);

		gridx = 0; // 第0行
		gridy = 0; // 第0列
		gridwidth = 2; // 占两单位宽度
		gridheight = 1; // 占一单位高度
		weightx = 0; // 窗口增大时组件宽度增大比率0
		weighty = 0; // 窗口增大时组件高度增大比率0
		anchor = GridBagConstraints.CENTER; // 容器大于组件size时将组件
		// 置于容器中央
		fill = GridBagConstraints.BOTH; // 窗口拉大时会填满水平与垂
		// 直空间
		inset = new Insets(0, 0, 0, 0); // 组件间间距
		ipadx = 0; // 组件内水平宽度
		ipady = 0; // 组件内垂直高度
		c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight,
				weightx, weighty, anchor, fill, inset, ipadx, ipady);
		gridbag.setConstraints(panel1, c);
		contentPane.add(panel1);

		gridx = 0;
		gridy = 1;
		c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight,
				weightx, weighty, anchor, fill, inset, ipadx, ipady);
		gridbag.setConstraints(panel2, c);
		contentPane.add(panel2);

		gridx = 2;
		gridy = 0;
		gridwidth = 1; // 占一单位宽度
		gridheight = 2; // 占两单位高度
		c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight,
				weightx, weighty, anchor, fill, inset, ipadx, ipady);
		gridbag.setConstraints(panel3, c);
		contentPane.add(panel3);

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

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

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

	// 处理ChangeEvent事件,当用户移动滑动杆时,label上的值会随着用户的移动而改变.
	public void stateChanged(ChangeEvent e) {
		if ((JSlider) e.getSource() == slider1)
			label1.setText("目前刻度:" + slider1.getValue());
		if ((JSlider) e.getSource() == slider2)
			label2.setText("目前刻度:" + slider2.getValue());
		if ((JSlider) e.getSource() == slider3)
			label3.setText("目前刻度:" + slider3.getValue());
	}
}

注:由于slider3设置延伸区值(Extent)为50,因此slider2刻度可变动的区域只到50,因此当slider2超过50刻度时就算你再向右移 动,刻度值一样维持在50上.