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. Linq第二讲

    这一讲,来说说集合.因为linq主要用于对数据源进行查询,集合是最常见的数据源. 集合 形式: 数组,列表List<T> Arraylist等. 特点: 可通过索引或键访问.可进行fore ...

  2. R语言笔记3--实例1

    综合性例子: 模拟产生统计专业同学的名单(学号区分),记录数学分析,线性代数.概率统计三科成绩,然后进行一些统计分析 1.首先产生一个向量(100个元素,代表100位学生) 2.模拟成绩 runif: ...

  3. cordova环境配置步骤

    1.安装node.js环境 官网: http://nodejs.org/ 2.sudo npm install -g cordova(一般会失败,需要用FQ安装或者用淘宝镜像安装,可以用FQ就可以不用 ...

  4. jquery 高亮

    <ul> <li id="0">冬瓜很好吃</li> <li id="1">西瓜不好吃</li> & ...

  5. MSSQL存储过程接收另一个存储过程返回列表

    CREATE TABLE #tmp(m_Meter_ID varchar(20),low_Voltage int,num_Attack int,num_DER int,company_id int,a ...

  6. 用GDB调试程序的设置 Segmentation fault(Core Dump)调试

    在写wifi库的时候碰见一个 Segmentation fault(Core Dump) 所以需要用GDB调试下. 在cmake的时候,修改CMakeLists.txt set(CMAKE_C_FLA ...

  7. java应用测试报告生成(二):利用ant的build.xml生成测试报告

    1.将写好的项目导出 在工程下会生成一个build.xml的蚂蚁图标的文件. 2.右击该文件,选择run as Ant build 其中的测试目录是可以选择的,如果涉及到顺序也可以调整顺序 3.执行后 ...

  8. Sockets

    Sockets time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  9. zzuli 1907: 小火山的宝藏收益 邻接表+DFS

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 113  Solved: 24 SubmitStatusWeb Board Description    ...

  10. easyui-combobox select 设置不分行(只显示在一行)

    使用easyui 1.4.4 <select id="hotalid" class="easyui-combobox" data-options=&quo ...