前几天讲了Swing基本的控件,今天开始讲特殊控件。一天讲2个吧,首先讲用JProgressBar,ProgressMonitor和BoundedRangeModel来实现进度条。然后讲用JSlider和BoundedRangeModel来实现滑动条。
进度条,eg
SimulatedTarget模拟了一个耗时程序,JProgressBar存在BoundedRangeModel用于保存数据对象。ProgressMonitor是进度对话框,用起来很方便,但就缺乏了自主性,eg
- public class TestProgressMonitor
- {
- Timer timer;
- public void init()
- {
- final SimulatedTarget target = new SimulatedTarget(1000);
-
- final Thread targetThread = new Thread(target);
- targetThread.start();
-
- final ProgressMonitor dialog = new ProgressMonitor(null ,
- "等待任务完成" , "已完成:" , 0 , target.getAmount());
-
- timer = new Timer(300 , new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
-
- dialog.setProgress(target.getCurrent());
-
- if (dialog.isCanceled())
- {
-
- timer.stop();
-
- targetThread.interrupt();
-
- System.exit(0);
- }
- }
- });
- timer.start();
- }
- public static void main(String[] args)
- {
- new TestProgressMonitor().init();
- }
- }
这个程序利用了上面的耗时程序。进度条就是那么简单。
滑动条和进度条差不多,他们共用一个模型BoundedRangeModel。下面是个滑动条的各样式的演示例子,eg
- public class TestJSlider
- {
- JFrame mainWin = new JFrame("滑动条示范");
- Box sliderBox = new Box(BoxLayout.Y_AXIS);
- JTextField showVal = new JTextField();
- ChangeListener listener;
- public void init()
- {
-
- listener = new ChangeListener()
- {
- public void stateChanged(ChangeEvent event)
- {
-
- JSlider source = (JSlider) event.getSource();
- showVal.setText("当前滑动条的值为:" + source.getValue());
- }
- };
-
- JSlider slider = new JSlider();
- addSlider(slider, "普通滑动条");
-
-
- slider = new JSlider();
- slider.setExtent(30);
- addSlider(slider, "保留区为30");
-
-
- slider = new JSlider(30 , 200);
-
- slider.setPaintTicks(true);
-
- slider.setMajorTickSpacing(20);
- slider.setMinorTickSpacing(5);
- addSlider(slider, "有刻度");
-
-
- slider = new JSlider();
-
- slider.setSnapToTicks(true);
-
- slider.setPaintTicks(true);
-
- slider.setMajorTickSpacing(20);
- slider.setMinorTickSpacing(5);
- addSlider(slider, "滑块停在刻度处");
-
-
- slider = new JSlider();
-
- slider.setPaintTicks(true);
-
- slider.setMajorTickSpacing(20);
- slider.setMinorTickSpacing(5);
-
- slider.setPaintTrack(false);
- addSlider(slider, "无滑轨");
-
-
- slider = new JSlider();
-
- slider.setPaintTicks(true);
-
- slider.setMajorTickSpacing(20);
- slider.setMinorTickSpacing(5);
-
- slider.setInverted(true);
- addSlider(slider, "方向反转");
-
-
- slider = new JSlider();
-
- slider.setPaintTicks(true);
-
- slider.setMajorTickSpacing(20);
- slider.setMinorTickSpacing(5);
-
- slider.setPaintLabels(true);
- addSlider(slider, "数值刻度标签");
-
-
- slider = new JSlider();
-
- slider.setPaintTicks(true);
-
- slider.setMajorTickSpacing(20);
- slider.setMinorTickSpacing(5);
-
- slider.setPaintLabels(true);
- Dictionary<Integer, Component> labelTable = new Hashtable<Integer, Component>();
- labelTable.put(0, new JLabel("A"));
- labelTable.put(20, new JLabel("B"));
- labelTable.put(40, new JLabel("C"));
- labelTable.put(60, new JLabel("D"));
- labelTable.put(80, new JLabel("E"));
- labelTable.put(100, new JLabel("F"));
-
- slider.setLabelTable(labelTable);
- addSlider(slider, "JLable标签");
-
-
- slider = new JSlider();
-
- slider.setPaintTicks(true);
-
- slider.setMajorTickSpacing(20);
- slider.setMinorTickSpacing(5);
-
- slider.setPaintLabels(true);
- labelTable = new Hashtable<Integer, Component>();
- labelTable.put(0, new JLabel(new ImageIcon("ico/0.GIF")));
- labelTable.put(20, new JLabel(new ImageIcon("ico/2.GIF")));
- labelTable.put(40, new JLabel(new ImageIcon("ico/4.GIF")));
- labelTable.put(60, new JLabel(new ImageIcon("ico/6.GIF")));
- labelTable.put(80, new JLabel(new ImageIcon("ico/8.GIF")));
-
- slider.setLabelTable(labelTable);
- addSlider(slider, "Icon标签");
-
- mainWin.add(sliderBox, BorderLayout.CENTER);
- mainWin.add(showVal, BorderLayout.SOUTH);
- mainWin.pack();
- mainWin.setVisible(true);
-
- }
-
- public void addSlider(JSlider slider, String description)
- {
- slider.addChangeListener(listener);
- Box box = new Box(BoxLayout.X_AXIS);
- box.add(new JLabel(description + ":"));
- box.add(slider);
- sliderBox.add(box);
- }
-
- public static void main(String[] args)
- {
- new TestJSlider().init();
- }
- }