我们在上个范例中看到的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值。