疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

时间:2023-03-08 16:56:35

http://blog.****.net/terryzero/article/details/3797782

2009-01-16 21:12 6722人阅读 评论(0) 收藏 举报
疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 分类:
J2SE(63) 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

版权声明:本文为博主原创文章,未经博主允许不得转载。

前几天讲了Swing基本的控件,今天开始讲特殊控件。一天讲2个吧,首先讲用JProgressBar,ProgressMonitor和BoundedRangeModel来实现进度条。然后讲用JSlider和BoundedRangeModel来实现滑动条。

进度条,eg

  1. public class TestJProgressBar
  2. {
  3. JFrame frame = new JFrame("测试进度条");
  4. //创建一条垂直进度条
  5. JProgressBar bar = new JProgressBar(JProgressBar.VERTICAL );
  6. JCheckBox indeterminate = new JCheckBox("不确定进度");
  7. JCheckBox noBorder = new JCheckBox("不绘制边框");
  8. public void init()
  9. {
  10. Box box = new Box(BoxLayout.Y_AXIS);
  11. box.add(indeterminate);
  12. box.add(noBorder);
  13. frame.setLayout(new FlowLayout());
  14. frame.add(box);
  15. //把进度条添加到JFrame窗口中
  16. frame.add(bar);
  17. //设置在进度条中绘制完成百分比
  18. bar.setStringPainted(true);
  19. noBorder.addActionListener(new ActionListener()
  20. {
  21. public void actionPerformed(ActionEvent event)
  22. {
  23. //根据该选择框决定是否绘制进度条的边框
  24. bar.setBorderPainted(!noBorder.isSelected());
  25. }
  26. });
  27. final SimulatedTarget target = new SimulatedTarget(1000);
  28. //以启动一条线程的方式来执行一个耗时的任务
  29. new Thread(target).start();
  30. //设置进度条的最大值和最小值,
  31. bar.setMinimum(0);
  32. //以总任务量作为进度条的最大值
  33. bar.setMaximum(target.getAmount());
  34. Timer timer = new Timer(300 , new ActionListener()
  35. {
  36. public void actionPerformed(ActionEvent e)
  37. {
  38. //以任务的当前完成量设置进度条的value
  39. bar.setValue(target.getCurrent());
  40. }
  41. });
  42. timer.start();
  43. indeterminate.addActionListener(new ActionListener()
  44. {
  45. public void actionPerformed(ActionEvent event)
  46. {
  47. //设置该进度条的进度是否确定
  48. bar.setIndeterminate(indeterminate.isSelected());
  49. bar.setStringPainted(!indeterminate.isSelected());
  50. }
  51. });
  52. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  53. frame.pack();
  54. frame.setVisible(true);
  55. }
  56. public static void main(String[] args)
  57. {
  58. new TestJProgressBar().init();
  59. }
  60. }
  61. //模拟一个耗时的任务
  62. class SimulatedTarget implements Runnable
  63. {
  64. //任务的当前完成量
  65. private volatile int current;
  66. //总任务量
  67. private int amount;
  68. public SimulatedTarget(int amount)
  69. {
  70. current = 0;
  71. this.amount = amount;
  72. }
  73. public int getAmount()
  74. {
  75. return amount;
  76. }
  77. public int getCurrent()
  78. {
  79. return current;
  80. }
  81. //run方法代表不断完成任务的过程
  82. public void run()
  83. {
  84. while (current < amount)
  85. {
  86. try
  87. {
  88. Thread.sleep(50);
  89. }
  90. catch(InterruptedException e)
  91. {
  92. }
  93. current++;
  94. }
  95. }
  96. }

SimulatedTarget模拟了一个耗时程序,JProgressBar存在BoundedRangeModel用于保存数据对象。ProgressMonitor是进度对话框,用起来很方便,但就缺乏了自主性,eg

  1. public class TestProgressMonitor
  2. {
  3. Timer timer;
  4. public void init()
  5. {
  6. final SimulatedTarget target = new SimulatedTarget(1000);
  7. //以启动一条线程的方式来执行一个耗时的任务
  8. final Thread targetThread = new Thread(target);
  9. targetThread.start();
  10. //创建进度对话框
  11. final ProgressMonitor dialog = new ProgressMonitor(null ,
  12. "等待任务完成" , "已完成:" , 0 , target.getAmount());
  13. //创建一个计时器
  14. timer = new Timer(300 , new ActionListener()
  15. {
  16. public void actionPerformed(ActionEvent e)
  17. {
  18. //以任务的当前完成量设置进度对话框的完成比例
  19. dialog.setProgress(target.getCurrent());
  20. //如果用户单击了进度对话框的”取消“按钮
  21. if (dialog.isCanceled())
  22. {
  23. //停止计时器
  24. timer.stop();
  25. //中断任务的执行线程
  26. targetThread.interrupt();
  27. //系统退出
  28. System.exit(0);
  29. }
  30. }
  31. });
  32. timer.start();
  33. }
  34. public static void main(String[] args)
  35. {
  36. new TestProgressMonitor().init();
  37. }
  38. }

这个程序利用了上面的耗时程序。进度条就是那么简单。

滑动条和进度条差不多,他们共用一个模型BoundedRangeModel。下面是个滑动条的各样式的演示例子,eg

  1. public class TestJSlider
  2. {
  3. JFrame mainWin = new JFrame("滑动条示范");
  4. Box sliderBox = new Box(BoxLayout.Y_AXIS);
  5. JTextField showVal = new JTextField();
  6. ChangeListener listener;
  7. public void init()
  8. {
  9. //定义一个监听器,用于监听所有滑动条
  10. listener = new ChangeListener()
  11. {
  12. public void stateChanged(ChangeEvent event)
  13. {
  14. //取出滑动条的值,并在文本中显示出来
  15. JSlider source = (JSlider) event.getSource();
  16. showVal.setText("当前滑动条的值为:" + source.getValue());
  17. }
  18. };
  19. //-----------添加一个普通滑动条-----------
  20. JSlider slider = new JSlider();
  21. addSlider(slider, "普通滑动条");
  22. //-----------添加保留区为30的滑动条-----------
  23. slider = new JSlider();
  24. slider.setExtent(30);
  25. addSlider(slider, "保留区为30");
  26. //-----------添加带主、次刻度的滑动条,并设置其最大值,最小值-----------
  27. slider = new JSlider(30 , 200);
  28. //设置绘制刻度
  29. slider.setPaintTicks(true);
  30. //设置主、次刻度的间距
  31. slider.setMajorTickSpacing(20);
  32. slider.setMinorTickSpacing(5);
  33. addSlider(slider, "有刻度");
  34. //-----------添加滑块必须停在刻度处滑动条-----------
  35. slider = new JSlider();
  36. //设置滑块必须停在刻度处
  37. slider.setSnapToTicks(true);
  38. //设置绘制刻度
  39. slider.setPaintTicks(true);
  40. //设置主、次刻度的间距
  41. slider.setMajorTickSpacing(20);
  42. slider.setMinorTickSpacing(5);
  43. addSlider(slider, "滑块停在刻度处");
  44. //-----------添加没有滑轨的滑动条-----------
  45. slider = new JSlider();
  46. //设置绘制刻度
  47. slider.setPaintTicks(true);
  48. //设置主、次刻度的间距
  49. slider.setMajorTickSpacing(20);
  50. slider.setMinorTickSpacing(5);
  51. //设置不绘制滑轨
  52. slider.setPaintTrack(false);
  53. addSlider(slider, "无滑轨");
  54. //-----------添加方向反转的滑动条-----------
  55. slider = new JSlider();
  56. //设置绘制刻度
  57. slider.setPaintTicks(true);
  58. //设置主、次刻度的间距
  59. slider.setMajorTickSpacing(20);
  60. slider.setMinorTickSpacing(5);
  61. //设置方向反转
  62. slider.setInverted(true);
  63. addSlider(slider, "方向反转");
  64. //-----------添加绘制默认刻度标签的滑动条-----------
  65. slider = new JSlider();
  66. //设置绘制刻度
  67. slider.setPaintTicks(true);
  68. //设置主、次刻度的间距
  69. slider.setMajorTickSpacing(20);
  70. slider.setMinorTickSpacing(5);
  71. //设置绘制刻度标签,默认绘制数值刻度标签
  72. slider.setPaintLabels(true);
  73. addSlider(slider, "数值刻度标签");
  74. //-----------添加绘制Label类型的刻度标签的滑动条-----------
  75. slider = new JSlider();
  76. //设置绘制刻度
  77. slider.setPaintTicks(true);
  78. //设置主、次刻度的间距
  79. slider.setMajorTickSpacing(20);
  80. slider.setMinorTickSpacing(5);
  81. //设置绘制刻度标签
  82. slider.setPaintLabels(true);
  83. Dictionary<Integer, Component> labelTable = new Hashtable<Integer, Component>();
  84. labelTable.put(0, new JLabel("A"));
  85. labelTable.put(20, new JLabel("B"));
  86. labelTable.put(40, new JLabel("C"));
  87. labelTable.put(60, new JLabel("D"));
  88. labelTable.put(80, new JLabel("E"));
  89. labelTable.put(100, new JLabel("F"));
  90. //指定刻度标签,标签是JLabel
  91. slider.setLabelTable(labelTable);
  92. addSlider(slider, "JLable标签");
  93. //-----------添加绘制Label类型的刻度标签的滑动条-----------
  94. slider = new JSlider();
  95. //设置绘制刻度
  96. slider.setPaintTicks(true);
  97. //设置主、次刻度的间距
  98. slider.setMajorTickSpacing(20);
  99. slider.setMinorTickSpacing(5);
  100. //设置绘制刻度标签
  101. slider.setPaintLabels(true);
  102. labelTable = new Hashtable<Integer, Component>();
  103. labelTable.put(0, new JLabel(new ImageIcon("ico/0.GIF")));
  104. labelTable.put(20, new JLabel(new ImageIcon("ico/2.GIF")));
  105. labelTable.put(40, new JLabel(new ImageIcon("ico/4.GIF")));
  106. labelTable.put(60, new JLabel(new ImageIcon("ico/6.GIF")));
  107. labelTable.put(80, new JLabel(new ImageIcon("ico/8.GIF")));
  108. //指定刻度标签,标签是ImageIcon
  109. slider.setLabelTable(labelTable);
  110. addSlider(slider, "Icon标签");
  111. mainWin.add(sliderBox, BorderLayout.CENTER);
  112. mainWin.add(showVal, BorderLayout.SOUTH);
  113. mainWin.pack();
  114. mainWin.setVisible(true);
  115. }
  116. //定义一个方法,用于将滑动条添加到容器中
  117. public void addSlider(JSlider slider, String description)
  118. {
  119. slider.addChangeListener(listener);
  120. Box box = new Box(BoxLayout.X_AXIS);
  121. box.add(new JLabel(description + ":"));
  122. box.add(slider);
  123. sliderBox.add(box);
  124. }
  125. public static void main(String[] args)
  126. {
  127. new TestJSlider().init();
  128. }
  129. }