Программирование. Программирование на Java Конспект лекций (ИТМО 2010). Справочник по языку Java и может использоваться как конспект лекционного курса Системы программирования Интернетприложений
Скачать 0.85 Mb.
|
94 Класс AWTEventMulticaster AWTEventMulticaster — класс, реализующий эффективную и потоко- безопасную диспетчеризацию событий для событий AWT. Характерное использование класса: public NewAWTComponent extends Component { ActionListener al = null; public synchronized void addActionListener(ActionListener l) { al = AWTEventMulticaster.add(al, l); } public synchronized void removeActionListener(ActionListener l) { al = AWTEventMulticaster.remove(al, l); } public void processEvent(AWTEvent e) { ActionListener l = al; if (l != null) { l.actionPerformed(new ActionEvent(this, 0, "action")); } } } В Swing для подобного функционала используется EventListenerList Основные события AWT Ссобытие, Интерфейс слушателя Элемент Методы слушателя Значение ActionEvent, ActionListener Button actionPerformed нажатие кнопки List двойной щелчок MenuItem выбор пункта меню TextField конец редактирования текста элемента, ENTER AdjustmentEvent AdjustmentListe ner Scrollbar adjustmentValueCha nged реализация прокрутки ComponentEvent ComponentListen Component componentHidden componentMoved перемещение, изменение размеров, стал скрытым или 95 er componentResized componentShown видимым ContainerEvent ContainerListen er Container componentAdded componentRemoved добавление или удаление элемента в контейнер FocusEvent FocusListener Component focusGained focusLost получение или потеря фокуса ItemEvent ItemListener Checkbox itemStateChanged установка (сброс) флажка CheckboxM enuItem установка (сброс) флажка у пункта меню Choice выбор элемента списка List выбор элемента списка KeyEvent, KeyListener Component keyPressed keyReleased keyTyped нажатие или отпускание клавиши MouseEvent, MouseListener MouseMotionList ener Component mouseClocked mouseEntered mouseExited mousePressed mouseReleased mouseDragged mouseMoved нажатие или отпускание кнопки мыши, курсор мыши вошел или покинул область элемента, перемещение мыши, перемещение мыши при нажатой кнопки мыши. TextEvent, TextListener TextCompo nent textValueChahged изменения в тексте элемента WindowEvent, WindowListener Window windowActivated windowClosed windowClosing windowDeactivated windowDeiconified windowOpened открытие, закрытие, минимизация, восстановление, запрос на обновление окна 96 JFC - Java Foundation Classes JFC — набор базовых библиотек, предназначенный для построения эффективных графических приложений. Состоит из: • AWT - Содержит компоненты AWT 1.1 • Java 2D - Обеспечивает расширенные возможности создания и обработки изображений. • Accessibility - Реализует вспомогательные технологии, такие как экранное считывание, обработка речи, и т.д. • Drag and Drop - Дает возможность взаимодействия приложений на языке Java с другими приложениями с использованием механизма Drag and Drop. • Swing - расширяет набор компонентов AWT 1.1 путем добавления легковесных компонентов, реализующих архитектуру MVC, в отличие от компонентов, основанных на использовании экспертов операционной системы. Swing Набор компонентов Swing - это разработанный на Java платформо- независимый набор компонентов графического пользовательского интерфейса. Особенности Swing-компонентов: • являются "легковесными", т.е. не используют средств операционной системы. • реализуют архитектуру PL&F (Pluggable Look and Feel), позволяя легко изменять вид и поведение работающего приложения. • реализуют компонентную технологию JavaBeans, и могут использоваться с любыми визуальными средствами разработки, поддерживающими работу с Beans-компонентами. Архитектура MVC и модель Swing MVC (Model-View-Controller) - технология создания элементов пользовательского интерфейса (рис. 20), основанная на взаимодействии 3 компонентов: 97 • Model (модель) - логическое представление данных • View (представление) - визуальное представление данных • Controller (контроллер) - обрабатывает входные данные и передает их изменения в модель. Рисунок 20. Модель MVC В Swing контроллер и представление объединяются в общий компонент под названием делегат (delegate). ComponentUI ButtonUI BasicButtonUI java.awt.ItemSelectable ButtonModel DefaultButtonModel Делегат getUI() setUI() getUI() setUI() JButton JButton getModel() setModel() getModel() setModel() Модель Рисунок 21. Модели и делегаты. 98 Model ● определят данные ● оповещает об изменеиях данных Model ● определят данные ● оповещает об изменеиях данных Controller ● преобразует ввод запросов пользователя в события ● преобразует события в запросы к модели ● преобразует события в отображение Controller ● преобразует ввод запросов пользователя в события ● преобразует события в запросы к модели ● преобразует события в отображение View ● отображает данные ● обновляет данные ● выбирает данные из модели View ● отображает данные ● обновляет данные ● выбирает данные из модели изменение состояние выбор отображения запрос состояния Оповещение об изменении модели Delegate Компоненты Swing в любой момент времени связаны с определенной моделью и с определенным делегатом (рис. 21), специфическими для данного компонента. Модели и делегаты реализуют соответствующие интерфейсы. Внешний вид компонент (Look & Feel) Так как в архитектуре MVC используется модульный принцип построения компонентов, то легко изменить внешний вид всех компонентов одновременно. Существует несколько стандартных и множество сторонних реализаций внешнего вида компонентов. //Устанавливает L&F, зависящий от платформы, //на которой работает программа try { UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName()); } catch (java.lang.ClassNotFoundException e) {} //Устанавливает Java L&F try { UIManager.setLookAndFeel (UIManager.getCrossPlatformLookAndFeelClassName()); } catch (java.lang.ClassNotFoundException e) {} Для изменения вида уже созданных и отображенных компонентов используется метод updateUI() каждого компонента. Для облегчения этого процесса можно вызвать метод SwingUtilities.updateComponentTreeUI() Пакеты Swing javax.swing Содержит платформонезависимую реализацию компонентов, адаптеров, моделей компонент и интерфейсов для делегатов и моделей javax.swing.border Объявляет интерфейс Border и реализующие его классы, для отображения бордюров - визуального обрамления компонентов Swing javax.swing.colorchooser Реализует компонент JColorChooser javax.swing.event В дополнение к стандартным типам событий, компоненты Swing могут порождать собственные события, собранные в этом пакете javax.swing.filechooser Реализует компонента JFileChooser javax.swing.plaf Содержит интерфесы и множество абстрактных 99 классов для поддержки PLAF (Pluggable Look-and- Feel) компонентов Swing javax.swing.plaf.basic Содержит классы (делегаты) интерфейса пользователя, которые реализуют базовое (кодовое имя - baisc) отображение компонентов Swing javax.swing.plaf.metal Реализует принятое по умолчанию Java- отображение компонентов Swing (кодовое имя - metal) javax.swing.plaf.multi Позволяет использовать несколько отображений компонентов Swing в одном приложении. javax.swing.plaf.synth Содержит классы и интерфейсы для реализации собственного отображения компонент. javax.swing.table Содержит интерфейсы и классы для поддержки работы с таблицами javax.swing.text Содержит классы поддержки работы с текстовыми компонентами javax.swing.text.* Содержит классы обработки текста в формате HTML и RTF javax.swing.tree Включает компоненты для JTree javax.swing.undo Обеспечивает поддержку undo/redo. Составные части окна В модели Swing внутренняя часть окна представляет собой корневую панель JRootPane , которая в свою очередь состоит из прозрачной панели (glass pane) и слоистой панели (layered pane). Прозрачная панель невидима, и используется для отображения подсказок и выплывающих меню. Слоистая панель тоже состоит из двух компонентов - линейки меню и панели содержимого (content pane). Компоновка осуществляется на панели содержимого: aFrame.getContentPane().setLayout (new FlowLayout()); aFrame.getContentPane().add(aComponent); При помещении компонента на слоистую панель можно указывать номер слоя, на который следует поместить компонент: layeredPane.add (component, new Integer(5)); Класс JComponent Является базовым (рис. 22) классом почти для всех Swing-компонентов пользовательского интерфейса (J-классов). Swing-компоненты 100 пользовательского интерфейса наследуют от класса JComponent следующие свойства: • реализация PL&F • расширяемость • обработка событий клавиатуры • прорисовка границ • масштабируемость • отображение подсказок • автопрокрутка • возможность отладки графики • поддержка вспомогательных технологий • многоязыковая поддержка Класс JPanel Является легковесным объектом, представляющим панель со встроенной поддержкой двойной буферизации. Интерфейс Icon и класс ImageIcon Интерфейс Icon описывает изображения фиксированного размера. Класс ImageIcon реализует интерфейс Icon для объекта типа java.awt.Image. public interface Icon { void paintIcon(Component c, Graphics g, int x, int y); int getIconWidth(); int getIconHeight(); } Отличия ImageIcon от java.awt.Image : • не требует монитора при загрузке • является сериализуемым Если объект типа IconImage использует динамически меняющееся изображение, то для его отображения необходимо связать наблюдатель ImageObserver с изображением IconImage . Обычно наблюдателем является тот компонент, на котором изображается ImageIcon IconImage picture = new IconImage("pic.gif"); Jbutton button = new Jbutton(picture); picture.setImageObserver(button); 101 Рисунок 22. JComponent java.lang.Object java.awt.Component java.awt.Container JComponent Класс JLabel Реализует однострочную текстовую метку с дополнительными возможностями по сравнению с java.awt.Label , такими как: • Наличие изображения • Возможность изменения взаимного расположения текста и изображения Пример использования: public class LabelPanel extends JPanel { public LabelPanel() { // Создать и добавить JLabel JLabel plainLabel = new JLabel("Plain Small Label"); add(plainLabel); // Создать вторую JLabel JLabel fancyLabel = new JLabel("Fancy Big Label"); // Реализовать объект Font для использования на метке Font fancyFont = new Font("Serif", Font.BOLD | Font.ITALIC, 32); // Связать шрифт и метку fancyLabel.setFont(fancyFont); // Создать изображение Icon Icon tigerIcon = new ImageIcon("SmallTiger.gif"); // Поместить изображение на метку fancyLabel.setIcon(tigerIcon); // Поместить текст справа от изображения fancyLabel.setHorizontalAlignment(JLabel.RIGHT); // Поместить на панель add(fancyLabel); } } Класс JButton Является реализацией кнопки с возможностью включения изображения. Фон кнопки должен совпадать с фоном контейнера, в котором она находится. public class ButtonPanel extends JPanel { public ButtonPanel() { Icon tigerIcon = new ImageIcon("SmallTiger.gif"); JButton myButton = new JButton("Tiger", tigerIcon); myButton.setBackground (SystemColor.control); add(myButton); } } 102 Класс JCheckBox Соответствует объекту CheckBox, не входящему в группу. Можно задавать собственные изображения для выбранного и невыбранного состояния. public class CheckboxPanel extends JPanel { Icon unchecked = new ToggleIcon (false); Icon checked = new ToggleIcon (true); public CheckboxPanel() { // Установить компоновку для JPanel setLayout(new GridLayout(2, 1)); // Создать элемент выбора с состоянием true JCheckBox cb1 = new JCheckBox("Choose Me", true); cb1.setIcon(unchecked); cb1.setSelectedIcon(checked); // Создать элемент выбора с состоянием false JCheckBox cb2 = new JCheckBox("No Choose Me", false); cb2.setIcon(unchecked); cb2.setSelectedIcon(checked); add(cb1); add(cb2); } class ToggleIcon implements Icon { boolean state; public ToggleIcon (boolean s) { state = s; } public void paintIcon (Component c, Graphics g, int x, int y) { int width = getIconWidth(); int height = getIconHeight(); g.setColor (Color.black); if (state) g.fillOval (x, y, width, height); else g.drawOval (x, y, width, height); } public int getIconWidth() { return 10; } public int getIconHeight() { return 10; } } } 103 Класс JRadioButton Соответствует объекту CheckBox , входящему в группу, так, что в данный момент времени может быть выбран только один из них. Группа объектов задается с помощью ButtonGroup public class RadioButtonPanel extends JPanel { public RadioButtonPanel() { // Установить компоновку GridLayout setLayout(new GridLayout(4,1)); // Объявление переключателя JRadioButton radioButton; // Реализация группы для переключателей ButtonGroup rbg = new ButtonGroup(); // Создание метки для группы JLabel label = new JLabel("Annual Salary: "); label.setFont(new Font("SansSerif", Font.BOLD, 14)); add(label); // Добавить новый переключатель radioButton = new JRadioButton("$45,000"); add (radioButton); // установить "горячую" клавишу radioButton.setKeyAccelerator ('4'); // Добавить переключатель в группу rbg.add (radioButton); // Установить данный переключатель по умолчанию radioButton.setSelected(true); // Установить еще 2 переключателя radioButton = new JRadioButton("$60,000"); radioButton.setKeyAccelerator ('6'); add (radioButton); rbg.add (radioButton); radioButton = new JRadioButton("$75,000"); radioButton.setKeyAccelerator ('7'); add (radioButton); rbg.add (radioButton); } } Класс JToggleButton Является суперклассом для JCheckBox и JRadioButton . Кнопка остается в нажатом состоянии, и возвращается в исходное состояние при повторном нажатии. public class ToggleButtonPanel extends JPanel { public ToggleButtonPanel() { // Установить компоновку GridLayout 104 setLayout(new GridLayout(4,1, 10, 10)); add (new JToggleButton ("Fe")); add (new JToggleButton ("Fi")); add (new JToggleButton ("Fo")); add (new JToggleButton ("Fum")); } } Класс JTextComponent Класс обеспечивает основные функции простого текстового редактора. Основными подклассами JTextComponent являются JTextField, JTextArea, JTextPane JTextField tf = new JTextField(); JTextArea ta = new JTextArea(); tf.setText("TextField"); ta.setText("JTextArea\n Allows Multiple Lines"); add(tf);add(ta); JTextPane tp = new JTextPane(); MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setFontFamily(attr, "Serif"); StyleConstants.setFontSize(attr, 18); StyleConstants.setBold(attr, true); tp.setCharacterAttributes(attr, false); add(tp); Класс JScrollBar Реализует полосу прокрутки public class ScrollbarPanel extends JPanel { public ScrollbarPanel() { setLayout(new BorderLayout()); JScrollBar sb1 = new JScrollBar (JScrollBar.VERTICAL, 0, 5, 0, 100); add(sb1, BorderLayout.EAST); JScrollBar sb2 = new JScrollBar (JScrollBar.HORIZONTAL, 0, 5, 0, 100); add(sb2, BorderLayout.SOUTH); } } Класс JSlider Реализует полосу прокрутки с возможностью разметки. public class SliderPanel extends JPanel { 105 public SliderPanel() { setBackground (Color.lightGray); setLayout(new BorderLayout()); setBackground (Color.lightGray); JSlider s1 = new JSlider (JSlider.VERTICAL, 0, 100, 50); s1.setPaintTicks(true); s1.setMajorTickSpacing(10); s1.setMinorTickSpacing(2); add(s1, BorderLayout.EAST); JSlider s2 = new JSlider (JSlider.VERTICAL, 0, 100, 50); s2.setPaintTicks(true); s2.setMinorTickSpacing(5); add(s2, BorderLayout.WEST); JSlider s3 = new JSlider (JSlider.HORIZONTAL, 0, 100, 50); s3.setPaintTicks(true); s3.setMajorTickSpacing(10); add(s3, BorderLayout.SOUTH); JSlider s4 = new JSlider (JSlider.HORIZONTAL, 0, 100, 50); s4.setBorder(LineBorder.createBlackLineBorder()); add(s4, BorderLayout.NORTH); } } Класс JProgressBar Данный класс позволяет отображать линейку прогресса, показывая ход выполнения операции. Использование JProgressBar: /Инициализация компонента JProgressBar progressBar = new JProgressBar(); progressBar.setMinimum(0); progressBar.setMaximum(numberSubOperations); //Выполнение операции progressBar.setValue(progressBar.getMinimum()); for (int i = 0; i < numberSubOperations; i++) { // Установка значения progressBar.setValue(i); } Класс JComboBox Представляет собой выпадающий список с возможностью выбора и редактирования. public class ComboPanel extends JPanel { String choices[] = {"Mercury", "Venus", "Earth", "Mars", 106 "Saturn", "Jupiter", "Uranus","Neptune","Pluto"}; public ComboPanel() { JComboBox combo1 = new JComboBox(); JComboBox combo2 = new JComboBox(); for (int i=0;i combo2.addItem (choices[i]); } combo2.setEditable(true); combo2.setSelectedItem("X"); combo2.setMaximumRowCount(4); add(combo1); add(combo2); } } Класс JList Реализует список элементов. public class ListPanel extends JPanel { String label [] = {"Cranberry", "Orange", "Banana", "Kiwi", "Blueberry", "Pomegranate", "Apple", "Pear", "Watermelon", "Raspberry", "Snozberry" }; public ListPanel() { setLayout (new BorderLayout()); JList list = new JList(label); ScrollPane pane = new ScrollPane(); pane.add (list); add(pane, BorderLayout.CENTER); } } Класс JScrollPane Реализует область прокрутки. public class ScrollPanel extends JPanel { public ScrollPanel() { setLayout(new BorderLayout()); Icon bigTiger = new ImageIcon("BigTiger.gif"); JLabel tigerLabel = new JLabel(bigTiger); JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().add(tigerLabel); add(scrollPane, BorderLayout.CENTER); |