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