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

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

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

标签: swing编程java任务timerstring

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

 分类:

J2SE(63) 

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

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

进度条,eg

[java] view plain copy

  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

[c-sharp] view plain copy

  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

[java] view plain copy

  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. }
时间: 2024-12-14 08:18:26

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

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

第十二章 并发编程 学习笔记

第十二章 并发编程 进程是程序级并发,线程是函数级并发. 三种基本的构造并发程序的方法: 进程:每个逻辑控制流是个一个进程,由内核进行调度和维护. I/O多路复用:应用程序在一个进程的上下文中显式地调度他们自己的逻辑流. 线程:运行在单一进程上下文中的逻辑流,由内核进行调度. 12.1 基于进程的并发编程 构造并发程序最简单的方法就是用进程. 使用大家都很熟悉的函数例如: fork exec waitpid 关于在父.子进程间共享状态信息:共享文件表,但不共享用户地址空间. 进程又独立的地址空间

第十二章 并发编程

第十二章 并发编程 三种基本的构造并发程序 进程:每个逻辑控制流是一个进程,由内核进行调度,进程有独立的虚拟地址空间 I/O多路复用:逻辑流被模型化为状态机,所有流共享同一个地址空间 线程:运行在单一进程上下文中的逻辑流,由内核进行调度,共享同一个虚拟地址空间 常用函数: fork exec waitpid 基于I/O多路复用的并发事件驱动服务器 事件驱动程序:将逻辑流模型化为状态机. 状态机: 状态 输入事件 转移 对于状态机的理解,参考EDA课程中学习的状态转换图的画法和状态机. 整体的流程

Java(第十二章)

第十二章 一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同) 2.1 成员变量,有默认值 在当前类直接通过成员变量名调用:在其他类中,通过该类的对象名.属性(成员变量)名调用:成员变量名称在同一个类中是唯一的. 2.2 局部变量,没有默认值,必须先赋值再使用 局部变量,只能在当前的方法中使用,其他方法和其他类不能调用:在同一个方法中名称是唯一的,

疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件

在Java中,把这些不同类型的输入.输出抽象为流(Stream),而其中输入或输出的数据称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了. 首先我要声明下:所谓的输入输出都是相对内存而言的 还要讲几个基本概念:字节流和字符流,字节流8位,主要由InputStream和OutputStream来处理.字符流16位,主要由Reader和Writer来处理. 节点流和处理流,磁盘或网络等读写的数据的流为节点流,对节点流进行封装和处理的流叫处理流. InputStream

《疯狂Java讲义》(二十二)---- 正则表达式

Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaab"); boolean b = m.matches(); //b = true Pattern对象可以多次重复使用.如果某个正则表达式仅需使用一次,则可以直接使用pattern类的静态matches方法: boolean b = Pattern.matches("a*b", "aaaab"); Pat

java基础(十二章)

一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同) 2.1 成员变量,有默认值 在当前类直接通过成员变量名调用:在其他类中,通过该类的对象名.属性(成员变量)名调用:成员变量名称在同一个类中是唯一的. 2.2 局部变量,没有默认值,必须先赋值再使用 局部变量,只能在当前的方法中使用,其他方法和其他类不能调用:在同一个方法中名称是唯一的,但多个方法

《疯狂Java讲义》(二十七)----泛型

菱形语法 List<String> strList = new ArrayList<String>(); Java7 后允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号即可. List<String> strList = new ArrayList<>(); 泛型接口/类 可以为任何类/接口增加泛型声明 class Apple<T> { private T info; public Apple() { } public Apple(T i

疯狂Java讲义(十四)---- 抽象类和接口

抽象类 抽象方法和抽象类必须使用abstract修饰符定义,有抽象方法的类只能被定义为抽象类,抽象类里可以没有抽象方法.抽象类不能被实例化. 接口 接口只是一种规范,定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里的实现细节,它只规定这些类必须提供某些方法.接口体现的是规范和实现分离的设计哲学. 接口语法: 修饰符可以是public或省略,如果省略修饰符,默认采用包权限访问控制符.所以一般都是public.因为接口是多个类共同的公共行为规范,因此接口里的所有成员都