ITEEDU

14-1-3:自定义JSlider标记名称:

我们在上个范例中看到的JSlider标记都是数字形态,当然我们也可以自定义自己想要的标记文字,这时候就必须使用JSlider所 提供的setLabelTable()方法。我们来看下面的例子。

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

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

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

		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.setPaintTrack(true);
		slider1.setSnapToTicks(true);
		label1 = new JLabel("目前刻度:" + slider1.getValue());
		panel1.add(label1);
		panel1.add(slider1);
		panel1.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createEtchedBorder(), "Slider 1", TitledBorder.LEFT,
				TitledBorder.TOP));

		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);

		JPanel panel2 = new JPanel();
		panel2.setLayout(new GridLayout(2, 1));
		slider2 = new JSlider(JSlider.HORIZONTAL);
		slider2.setMinimum(0);
		slider2.setMaximum(100);
		slider2.setValue(30);
		slider2.setExtent(50);
		slider2.setPaintTicks(true);
		slider2.setMajorTickSpacing(10);
		slider2.setMinorTickSpacing(5);
		slider2.setPaintLabels(true);
		slider2.putClientProperty("JSlider.isFilled", Boolean.TRUE);
		label2 = new JLabel("目前刻度:" + slider2.getValue());
		panel2.add(label2);
		panel2.add(slider2);
		panel2.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createEtchedBorder(), "Slider 2", TitledBorder.LEFT,
				TitledBorder.TOP));

		table = new Hashtable();
		table.put(new Integer(0), new JLabel("弱"));
		table.put(new Integer(25), new JLabel("有点弱"));
		table.put(new Integer(50), new JLabel("中"));
		table.put(new Integer(75), new JLabel("有点强"));
		table.put(new Integer(100), new JLabel("强"));
		slider2.setLabelTable(table);

		JPanel panel3 = new JPanel();
		panel3.setLayout(new GridLayout(2, 1));
		slider3 = new JSlider(20, 80);
		slider3.setOrientation(JSlider.VERTICAL);
		slider3.setPaintTicks(true);
		slider3.setMajorTickSpacing(30);
		slider3.setMinorTickSpacing(10);
		slider3.setPaintLabels(true);
		slider3.putClientProperty("JSlider.isFilled", Boolean.TRUE);
		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, 130));
		panel2.setPreferredSize(new Dimension(300, 130));
		panel3.setPreferredSize(new Dimension(150, 260));

		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;
		weighty = 0;
		anchor = GridBagConstraints.CENTER;
		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 SliderDemo3();
	}

	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());
	}
}
说明:

要改变标记值必须使用setLabelTable(Dictionary table)方法,参数Dictionary本身是一个抽象类,我们并不能直接就new 出一个Dictionary对象,而必须使用它的子类Hashtable来产生Dictionary类型的对象。Hashtable存储信息的方式是以 key-value pair类型来存储,换名话说,当你要找某个对象时,你就必须知道此对象的key值。而在此例中,我们要换原有 JSlider上的文字,必须指明那个数字要理发成什么文字。例如table.put(new Integer(0)),new JLabel("弱"))就表示数字 0要变更成文字"弱",在Hashtable中,Integer(0)就是对象JLabel("弱")的key值。