JavaSwing编程:进度条和滑动条

前几天讲了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.     private volatile int current;
  65.     //总任务量
  66.     private int amount;
  67.     public SimulatedTarget(int amount)
  68.     {  
  69.         current = 0;
  70.         this.amount = amount;
  71.     }
  72.     public int getAmount()
  73.     {  
  74.       return amount;
  75.     }
  76.     public int getCurrent()
  77.     {  
  78.         return current;
  79.     }
  80.     //run方法代表不断完成任务的过程
  81.     public void run()
  82.     {  
  83.         while (current < amount)
  84.         { 
  85.             try
  86.             {
  87.                 Thread.sleep(50);
  88.             }
  89.             catch(InterruptedException e)
  90.             {
  91.             }
  92.             current++;
  93.         }
  94.     }
  95. }

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 labelTable = new Hashtable();
  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();
  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. }

文章标题:JavaSwing编程:进度条和滑动条
网站地址:http://www.gawzjz.com/qtweb2/news5/27255.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联