程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Swing編程:進度條和滑動條

Java Swing編程:進度條和滑動條

編輯:關於JAVA

前幾天講了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. }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved