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上.