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

2009-01-16 21:12 6722人阅读 评论(0) 收藏 举报
 分类:
J2SE(63) 

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

前几天讲了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. }

疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条的更多相关文章

  1. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java异常第二十二章:try-with-resources语句详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  4. “全栈2019”Java异常第十二章:catch与异常匹配

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  5. “全栈2019”Java第一百一十二章:什么是闭包?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. “全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. “全栈2019”Java第七十二章:静态内部类访问外部类成员

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第六十二章:接口与常量详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第四十二章:静态代码块与初始化顺序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Linux 解决 bash ./ 没有那个文件或目录 的方法

    在Debian 或 ubuntu 64位下运行 ./xxx 会跳出来说没有这个文件或者目录,但是ls看又有这个文件,很是奇怪. 其实原因很简单,是因为他没有32位的运行库 ia32-libs ,直接安 ...

  2. 决策树J48算法

    1.J48原理 基于从上到下的策略,递归的分治策略,选择某个属性放置在根节点,为每个可能的属性值产生一个分支,将实例分成多个子集,每个子集对应一个根节点的分支,然后在每个分支上递归地重复这个过程.当所 ...

  3. 解析JSON对象与字符串之间的相互转换

    在开发的过程中,如果对于少量参数的前后台传递,可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,这样后台 接受的时候Request多个很麻烦 ...

  4. htaccess 实现网址缩短

    访问 :app.xxx.com/a 解析到:app.xxx.com/index.php/app/a <IfModule mod_rewrite.c> RewriteEngine on Re ...

  5. caffe卷积输入通道如何到输出通道

    今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比如10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定 ...

  6. 网站的性能优化与安全(高效C#编码优化)

    1. Foreach 比 For 性能高30%2. 避免是使用ArrayList, 因为任何对象到ArrayList都有封装为Object,出来还要拆箱.    用泛型去掉3. HashTalbe取代 ...

  7. mongodb 慢SQL查询

    在 MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database Profiler.不仅有,而且还有一些比MySQL ...

  8. 【转】How to build and install PHP 5.6.9 from source on Ubuntu 14.04 VPS

    原文 https://vpsineu.com/blog/how-to-build-and-install-php-5-6-9-from-source-on-ubuntu-14-04-vps/ In t ...

  9. java解析XML获取城市代码

    运行前先导入dom4j架包,由于我们公司用的代理服务器所以下面我设置了代理ip,不需要的可直接忽略 package com.chengshidaima.tools; import java.io.Bu ...

  10. Segments POJ 3304 直线与线段是否相交

    题目大意:给出n条线段,问是否存在一条直线,使得n条线段在直线上的投影有至少一个公共点. 题目思路:如果假设成立,那么作该直线的垂线l,该垂线l与所有线段相交,且交点可为线段中的某两个交点 证明:若有 ...