Про java swing - часть 7

February 26, 2008

Полоса прогресса – JProgressBar



Возможны два режима отображения прогресса. В первом случае мы знаем общее количество работы, которую необходимо выполнить. Тогда имеет смысл задать для JProgressbar нижнюю и верхнюю границу, затем изменяя по мере выполнения работы значение свойства value мы показываем сколько работы было уже выполнено. Во втором случае мы не можем определить время работы. Поэтому имеет смысл вывести бегающую полоску: мол, смотри, хозяин, работа идет.
  1. final JFrame jf = new JFrame("progress bar pics");
  2.  
  3. // При создании JProgressBar  вы указываете ориентацию полосы прогресса.
  4. // Также вы должны указать значение min и max в которых изменяется показатель выполнения 
  5. // некоторой работы                                                                        
  6.  
  7. JProgressBar jpr_def = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100); 
  8. jpr_def.setValue(55);// текущее значние прогресса выполнения некоторой операции   
  9. jpr_def.setString("Задача выполняется. Ждите");
  10. jpr_def.setStringPainted(true);   
  11.  
  12. JProgressBar jpr_indef = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);      
  13. jpr_indef.setString("Задача выполняется неопределенное количество времени. Ждите");
  14. jpr_indef.setStringPainted(true);  
  15. // Только в этой строке есть отличие в режиме работы. 
  16. // Если вы сделаете вызов c параметром false,  то значение value будет проигнорировано 
  17. // и автоматически будет создан  
  18. // таймер, который будет прокручивать прогресс до тех пор пока вы его не остановите
  19. // (поставив режим снова в determinate)    
  20. jpr_indef.setIndeterminate(true);    
  21.  
  22. JPanel pa = new JPanel(new FlowLayout()); 
  23. pa.add(jpr_def); 
  24. pa.add(jpr_indef);
  25.  
  26. jf.getContentPane().add(pa); 
  27.  
  28.  
  29. jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  30. jf.pack();
  31. SwingUtilities.invokeLater(new Runnable() { 
  32.     public void run() {   
  33.         jf.setVisible(true);
  34.     }
  35. });


Меню



На следующей картинке представлена иерархия компонентов использующихся при создании меню для формы.



Итак: в основе меню лежит класс JmenuBar (именно экземпляр данного класса помещается на диалоговое окно), который состоит из множества пунктов. Каждый из этих пунктов либо является "просто кнопкой" или же кнопка с "check" отметкой или же "radio"-кнопка. В случае, если некоторый пункт меню является подменю, то используется класс JMenu (внутрь этого класса также можно вкладывать подпункты как было описано выше). Для разделения отдельных пунктов используется разделитель Jseparator. Для создания контекстных меню вы используете класс JpopupMenu, который также нужно наполнить элементами.

В следующем примере я использую немного другую методику наполнения меню элементами основанную на том, чтобы добавлять не графические элементы в меню, а затем привязывать их к некоторому обработчику событий, а сразу добавить в меню событие, его обработчик и такие параметры как визуальное представление события (текст надписи и картинка иконки).
  1. final JFrame jf = new JFrame("scroller pic");                                                         
  2.  
  3. JMenuBar mainMenu = new JMenuBar();  
  4. // Создаем меню. Теперь начнем наполнять его содержимым.                                             
  5. // Прежде всего создадим подменю                                                                      
  6. JMenu fileMenu = new JMenu("Файл"); 
  7. // Если нам нужен пункт меню, то проще всего его создать как Action                                   
  8. fileMenu.add( 
  9.         new AbstractAction("Открыть", new ImageIcon("C:\\tmp\\spic1.jpg")) {
  10.             public void actionPerformed(ActionEvent e) {
  11.                 JOptionPane.showMessageDialog(null, "File Menus --> Open"); 
  12.             }  
  13.         }   
  14. ); 
  15.  
  16. fileMenu.add(  
  17.         new AbstractAction("Закрыть", new ImageIcon("C:\\tmp\\spic2.jpg")) { 
  18.             public void actionPerformed(ActionEvent e) { 
  19.                 JOptionPane.showMessageDialog(null, "File Menus --> Close"); 
  20.             } 
  21.         } 
  22. );  
  23. // создаем разделитель пунктов меню  
  24. fileMenu.add(new JSeparator());    
  25. fileMenu.add(                                                                                         
  26.         new AbstractAction("Выход", new ImageIcon("C:\\tmp\\spic3.jpg")) { 
  27.             public void actionPerformed(ActionEvent e) {
  28.                 System.exit(0); 
  29.             } 
  30.         }
  31. );                                                                                                    
  32. // еще один разделитель 
  33. fileMenu.add(new JSeparator()); 
  34. // второй способ создать пункт меню (не через Action) позволяет нам выбрать внешний вид компонента    
  35. // этот пункт меню создан в виде check-отметки 
  36. JCheckBoxMenuItem menuItemTrace = new JCheckBoxMenuItem("Сообщать, когда что-либо делаешь?");         
  37. fileMenu.add(menuItemTrace);  
  38.  
  39.  
  40. // здесь пункты меню реализованы в виде радио-кнопок. Ведь делать и добро и зло одновременно нельзя.  
  41. JRadioButtonMenuItem menuItemGood = new JRadioButtonMenuItem("Делать Добро"); 
  42. fileMenu.add(menuItemGood);  
  43. JRadioButtonMenuItem menuItemEvel = new JRadioButtonMenuItem("Делать Зло"); 
  44. fileMenu.add(menuItemEvel);                                                                           
  45.  
  46. // Теперь нужно объединить две созданные радиокнопки в одну группу 
  47. ButtonGroup goe = new ButtonGroup();  
  48. // Созданный нами две радиокнопки работают не вместе, а отдельно друг от друга.
  49. // Поэтому я должен их сгруппировать. 
  50. // Чтобы обеспечить возможность выбора в момент времени только одной из них. 
  51. goe.add(menuItemEvel); 
  52. goe.add(menuItemGood); 
  53. mainMenu.add(fileMenu);
  54. // Последний шаг – присоединяем созданное меню к форме 
  55. jf.setJMenuBar(mainMenu); 
  56.  
  57.  
  58. jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  59. jf.pack();  
  60. SwingUtilities.invokeLater(new Runnable() {  
  61.     public void run() {  
  62.         jf.setVisible(true); 
  63.     }  
  64. });


Categories: Java