疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782
版权声明:本文为博主原创文章,未经博主允许不得转载。
前几天讲了Swing基本的控件,今天开始讲特殊控件。一天讲2个吧,首先讲用JProgressBar,ProgressMonitor和BoundedRangeModel来实现进度条。然后讲用JSlider和BoundedRangeModel来实现滑动条。
进度条,eg
- public class TestJProgressBar
- {
- JFrame frame = new JFrame("测试进度条");
- //创建一条垂直进度条
- JProgressBar bar = new JProgressBar(JProgressBar.VERTICAL );
- JCheckBox indeterminate = new JCheckBox("不确定进度");
- JCheckBox noBorder = new JCheckBox("不绘制边框");
- public void init()
- {
- Box box = new Box(BoxLayout.Y_AXIS);
- box.add(indeterminate);
- box.add(noBorder);
- frame.setLayout(new FlowLayout());
- frame.add(box);
- //把进度条添加到JFrame窗口中
- frame.add(bar);
- //设置在进度条中绘制完成百分比
- bar.setStringPainted(true);
- noBorder.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent event)
- {
- //根据该选择框决定是否绘制进度条的边框
- bar.setBorderPainted(!noBorder.isSelected());
- }
- });
- final SimulatedTarget target = new SimulatedTarget(1000);
- //以启动一条线程的方式来执行一个耗时的任务
- new Thread(target).start();
- //设置进度条的最大值和最小值,
- bar.setMinimum(0);
- //以总任务量作为进度条的最大值
- bar.setMaximum(target.getAmount());
- Timer timer = new Timer(300 , new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- //以任务的当前完成量设置进度条的value
- bar.setValue(target.getCurrent());
- }
- });
- timer.start();
- indeterminate.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent event)
- {
- //设置该进度条的进度是否确定
- bar.setIndeterminate(indeterminate.isSelected());
- bar.setStringPainted(!indeterminate.isSelected());
- }
- });
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.pack();
- frame.setVisible(true);
- }
- public static void main(String[] args)
- {
- new TestJProgressBar().init();
- }
- }
- //模拟一个耗时的任务
- class SimulatedTarget implements Runnable
- {
- //任务的当前完成量
- private volatile int current;
- //总任务量
- private int amount;
- public SimulatedTarget(int amount)
- {
- current = 0;
- this.amount = amount;
- }
- public int getAmount()
- {
- return amount;
- }
- public int getCurrent()
- {
- return current;
- }
- //run方法代表不断完成任务的过程
- public void run()
- {
- while (current < amount)
- {
- try
- {
- Thread.sleep(50);
- }
- catch(InterruptedException e)
- {
- }
- current++;
- }
- }
- }
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, "普通滑动条");
- //-----------添加保留区为30的滑动条-----------
- 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, "数值刻度标签");
- //-----------添加绘制Label类型的刻度标签的滑动条-----------
- 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"));
- //指定刻度标签,标签是JLabel
- slider.setLabelTable(labelTable);
- addSlider(slider, "JLable标签");
- //-----------添加绘制Label类型的刻度标签的滑动条-----------
- 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")));
- //指定刻度标签,标签是ImageIcon
- 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();
- }
- }
疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条的更多相关文章
- “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第二十二章:try-with-resources语句详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java异常第十二章:catch与异常匹配
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第一百一十二章:什么是闭包?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第七十二章:静态内部类访问外部类成员
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第六十二章:接口与常量详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第四十二章:静态代码块与初始化顺序
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- Linux 解决 bash ./ 没有那个文件或目录 的方法
在Debian 或 ubuntu 64位下运行 ./xxx 会跳出来说没有这个文件或者目录,但是ls看又有这个文件,很是奇怪. 其实原因很简单,是因为他没有32位的运行库 ia32-libs ,直接安 ...
- 决策树J48算法
1.J48原理 基于从上到下的策略,递归的分治策略,选择某个属性放置在根节点,为每个可能的属性值产生一个分支,将实例分成多个子集,每个子集对应一个根节点的分支,然后在每个分支上递归地重复这个过程.当所 ...
- 解析JSON对象与字符串之间的相互转换
在开发的过程中,如果对于少量参数的前后台传递,可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,这样后台 接受的时候Request多个很麻烦 ...
- htaccess 实现网址缩短
访问 :app.xxx.com/a 解析到:app.xxx.com/index.php/app/a <IfModule mod_rewrite.c> RewriteEngine on Re ...
- caffe卷积输入通道如何到输出通道
今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比如10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定 ...
- 网站的性能优化与安全(高效C#编码优化)
1. Foreach 比 For 性能高30%2. 避免是使用ArrayList, 因为任何对象到ArrayList都有封装为Object,出来还要拆箱. 用泛型去掉3. HashTalbe取代 ...
- mongodb 慢SQL查询
在 MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database Profiler.不仅有,而且还有一些比MySQL ...
- 【转】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 ...
- java解析XML获取城市代码
运行前先导入dom4j架包,由于我们公司用的代理服务器所以下面我设置了代理ip,不需要的可直接忽略 package com.chengshidaima.tools; import java.io.Bu ...
- Segments POJ 3304 直线与线段是否相交
题目大意:给出n条线段,问是否存在一条直线,使得n条线段在直线上的投影有至少一个公共点. 题目思路:如果假设成立,那么作该直线的垂线l,该垂线l与所有线段相交,且交点可为线段中的某两个交点 证明:若有 ...