1 / 76

Тема 9 . Модел-Начин на изобразяване-Контролер в SWING

Тема 9 . Модел-Начин на изобразяване-Контролер в SWING. Съдържание. Особености на Модел-Начин на изобразяване-Контролер ( MVC) в Swing Същност ; Схема на модела ; Паралелизъм в архитектурата на MVC. Имплементация Основни пакети; Йерархията на някои от класовете на JFC; Елементи;

latif
Download Presentation

Тема 9 . Модел-Начин на изобразяване-Контролер в SWING

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Тема 9. Модел-Начин на изобразяване-Контролер в SWING

  2. Съдържание • Особености на Модел-Начин на изобразяване-Контролер ( MVC) в Swing • Същност; • Схема на модела; • Паралелизъм в архитектурата на MVC. • Имплементация • Основни пакети; • Йерархията на някои от класовете на JFC; • Елементи; • Събитиен модел; • CRC карти за MVC • Рамкова програма на модела; • Моделиране на таблични интерфейсни класове с тeхнология SWING; • Моделиране на таблични интерфейсни класове с тeхнология SWING • Добавяне на таблицата в прозорец; • Установяване и смяна на ширината на колоните; • Установяване на потребителска селекция; • Изграждане на модел на таблицата • Редактори и интерпретатори на типовете; • Създаване на комбиниран списък за редакция на данни; • Валидизиране на потребителските данни; • Добавяне на подсказки; • Връзка на таблица от базата данни с табличен интерфейс...

  3. Особености на MVC в Swing. Същност Същност на модела В Swing се използва опростен вариант на ( MVC) наречен делегиран модел. Той е комбинация между модел и изобразяване в общ елемент, който изобразява компонента и обработва потребителските събития. Обозначава се като UI delegate.

  4. Особености на MVC в Swing. Схема на модела Схема на модела:

  5. Особености на MVC в Swing.Схема на модела Разделяне на отговорностите: • Моделът отговаря за съхраняване на информацията за състоянието на компонента. • Общият делегиран потребителски интерфейс е отговорен за начина на изобразяване и за потребителските въздействия с помощта на пакета AWT. Това разделяне определя двупосочната връзка между модела и общия елемент. Предимство: един и същ модел може да работи с много делегирани интерфейси – допуска се паралелизъм.

  6. Особености на MVC в Swing.Схема на модела Пример: Ако трябва да се изобразяват данни в таблица и графика, това може да се направи с общ модел и множество от начини на извеждане. Ако е необходимо да се променят данните, това се прави на едно място-изображенията ще се обновят от обновените данни в съответствие с новото състояние на модела. Това позволява свободно променяне на изгледите на компонента, добавяне на нови такива и др. преработки без да се засяга работата на модела.

  7. Особености на MVC в Swing.Паралелизъм в архитектурата на MVC Паралелизъм:

  8. Особености на MVC в Swing.Паралелизъм в архитектурата на MVC Например-документ: • Редактиращо изобразяване; • Изобразяване на печат; • Отделни начини за изобразяване на всяка от старниците на документа. Всеки потребителски интерфейс се занимава с това, което трябва да знае за неговата специфична задача, но всяко от тях взаимодейства с общия модел. Накрая всяко изобразяване се свързва с потребителски интерфейс, реализиран посредством обекта контролер.

  9. Особености на MVC в Swing.Паралелизъм в архитектурата на MVC Действие: • Моделът има N начина на изобразяване. Моделът е един, към който има множество начини на изобразяване и асоциирани към тях класове контролер. • Контролерите получават потребителските действия, като на всяко събитие, което е необходимо на приложението се изпраща съобщение за промяна към модела. • Промяната на модела може да се предизвика и от събития, получени от асинхронни промени в базата от данни. Независимо от причината, когато моделът се промени, веднага се уведомяват всички изобразявания и те се преизобразяват.

  10. Особености на MVC в Swing.Паралелизъм в архитектурата на MVC В Java, контролера и изобразяването са комбинирани. Това произтича от проекта на пакета за интерфейс, например изучавания по дисциплината интерфейс Swing. По този начин приложението се разделя на модел и асоциирани View/Controllers, представени като интерфейсни компоненти на Swing и техните слушатели ( listeners ).

  11. Особености на MVC в Swing.Паралелизъм в архитектурата на MVC Независимо от фактическото изпълнение на View/Controllers, главната идея на MVC трябва да отдели модела от изобразяването му на потребителски интерфейс. Предимства на подхода: • Моделът може да се разработи напълно независимо от начина, по който ще се изобразява; • При такава независимост на модела има голяма гъвкавост при разработката на начините, които могат да се разработят за показване на модела; • Новите представяния могат да се създават заедно с целия потребителски интерфейс и независимо от модела.

  12. Имплементация В Java View и Controller се представят от слушателите listeners. Предимствата на обединението са независимостта на разработване на модела от видовете изобразявания. • Потребителските интерфейси (GUI - Graphic User Interface) на аплетите съдържат стандартни графични компоненти, например: • бутони; • списъци; • менюта и др.

  13. Имплементация. Основни пакети За изграждане на GUI Java 2 предлага пакети, обединени под общото название JFC (Java Foundation Classes). Основни пакети: • java.awt. Осигурява необходимата инфраструктура на GUI и всички видове GUI-компоненти. • java.awt.event. Реализира събитийния модел на Java. Осигурява обработката на събитията, генерирани в резултат от манипулациите на потребителя с GUI, като например натискаане на бутон, придвижване на мишката и др. • javax.swing. Предлага нови, по-усъвършенствани и по-естетични GUI-компоненти в сравнение с java.awt, наричани Swing-компоненти.

  14. Имплементация. Основни пакети • Пакетите java.awtи java.awt.event, заедно с пакета java.awt.datatransfer, са известни под общото название AWT (Abstract Window Toolkit). В Java 2 се използва версията AWT 1.1. Пакетът javax.swing и още 15 други пакета са известни под общото название Swing.

  15. Имплементация. Основни пакети Преди появата на Swing, пакетите на AWT осигуряват всички необходими GUI-компоненти. И днес те могат да се използват за това. Препоръчва се използване на Swing-компонентите като по-съвършени. Но Swing не е заместител на AWT 1.1. Swing е част от общия GUI-инструментариум на JFC. Имената на Swing-компонентите: • Образувани са от тези на AWT с началната им буква “J”. Например: AWTButton - Swing JButton. • Компонентът JApplet, подобно на JFrame, представлява контейнер от най-високо ниво. Swing-компонентите на аплетите се разполагат в него. Той притежава четирислойна структура от повърхности, от които за програмистът най-важен е четвъртият слой, наричан content pane.

  16. Имплементация. Основни пакети Пример: Един бутон се разполага в JAppletчрез следния код: JApplet applet = new JApplet(); . . . . . . . . . . . . . . . . . . . . . . . . Container contentPane = applet.getContentPane(); JButton button = new JButton(“OK”); contentPane.add(button);

  17. Имплементация. Йерархията на някои от класовете на JFC

  18. Имплементация. Елементи Върху content paneмогат да се разполагат и панели. Те се създават посредством класа JPanel. Панелите се характеризират с две свойства: • притежават повърхност, върху която може да се изобразява текст и графика; • те са контейнери, които също биха могли да съдържат в себе си GUI-компоненти.

  19. Имплементация. Елементи Включване на панел в контейнер от тип JApplet се извършва по следния начин: Container contentPane = applet.getContentPane(); JPanel panel = new JPanel(); contentPane.add(panel);

  20. Имплементация. Събитиен модел Събитийният модел на Java е валиден и за аплетите. В резултат от потребителските въздействия сграфичния интерфейс, Swing-компонентите генерират събития, които се обработват. Компонетите са източници на събития(event sources). Обработката на събитията се извършва от съответстващите им обработчици на събития (event handlers). Последните се наричат още “слушатели” (event listeners), понеже се намират непрекъснато в режим на подслушване за наличие на възникнало събитие.

  21. Имплементация. Събитиен модел Всяко събитие се представя от обект (event object), който съдържа в себе си информация относно събитието:

  22. Имплементация. Събитиен модел За да може даден източник да знае на кого от слушателите да изпрати съобщение за възникнало събитие, необходимо е слушателят за този вид събития да бъде регистриран в източника:

  23. Имплементация. Събитиен модел • Има случаи, когато един и същ източник е в състояние да генерира различни по вид събития. Това означава, че източникът, в зависимост от вида на събитието, би следвало да може да изпраща съобщения на различни слушатели. За да може това да се осъществява успешно, в източника се регистрират едновременно повече слушатели.

  24. Имплементация. Събитиен модел За всеки обработчик (слушател) на събития трябва да са изпълнени три условия: • Слушателят за определен вид събитие трябва да бъде обект на клас, който реализира интерфейс, съответстващ на този вид събитие. Такъв тип интерфейси, предназначени за събития, биват наричани с общото название интерфейси за подслушване (listener interface). В декларацията на класа на слушателя следва да се укаже, че класът имплементира нужния интерфейс за подслушване, като например: public class MyClass implements ActionListener { . . . } или пък че наследява клас, който реализира същия интерфейс.: • Обработчикът (слушателят) следва да е регистриран в източника на събитието. Осъществява се по следния примерен начин: button.addActionListener(референция на обекта-слушател на MyClass); • В класа на обекта-слушател (в случая в MyClass) трябва да са припокрити методите на слушателския интерфейс: public void actionPerformed(ActionEvent e) { // Код, обработващ събитието }

  25. Имплементация. Събитиен модел Пример, в който обект на класа MyClass, представен чрез this,бива регистриран в обекта button, който е източник на събития от тип ActionEvent: public class MyClass extends JApplet implements ActionListener { MyClass() { // Конструктор . . . . . . . . . . . . . . . . . . . . . . . . . . button.addActionListener(this); . . . . . . . . . . . . . . . . . . . . . . . } public void actionPerformed(ActionEvent e) { . . . . . . . . . . . . . . . . . . . . . . . . . . } . . . . . . . . . . . . . . . . . . . . . . . . . }

  26. Имплементация. Събитиен модел • Често пъти слушателите се реализират чрез анонимни класове (класове, дефинирани вътре в други класове). В този случай в декларацията на потребителския клас не е необходимо да се указва, че той реализира слушателския интерфейс. Пример: public class MyClass extends JApplet { . . . . . . . . . . . . . . . . . . . . button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { . . . . . . . . . . . . . . . . . . . . . . . } }); . . . . . . . . . . . . . . . . . . . . . . . }

  27. Имплементация. Събитиен модел Интерфейсът ActionListenerсе използва за събития, възникнали в резултат на: • натискане на бутон на мишката; • след натискане на клавиша <Enter> в края на въведен текст (в текстово поле от тип JTextField); • след избор на елемент от меню.

  28. Имплементация. Събитиен модел В пакета java.awt.eventсе съдържат общо 11 основни слушателски интерфейса: • ActionListener-actionPerformed( ); • AdjustmentListener-adjustmentValue-Changed( ); • ComponentListener • componentResized( ) • componentMoved( ) • componentShown( ) • componentHidden( ); • ContainerListener-componentAdded( ), componentRemoved( ); • KeyListener-клавиатура: keyTyped( ),keyPressed( ),keyReleased( ); • MouseListener-бутони и др.; • MouseMotionListener-за движения:mouseDragged( ), mouseMoved( ); • MenuListener-menuCanceled( ),menuDeselected( ),menuSelected( ); • FocusListener-focusGained( ), focusLost( ); • ItemListener-itemStateChanged( ); • WindowListener:windowOpened( ),windowClosing( ),windowClosed( ) ...

  29. Имплементация. Събитиен модел Онези от тях, които съдържат по-голям брой методи, са разширени с адаптерни класове: • ComponentAdapter; • ContainerAdapter; • KeyAdapter; • MouseAdapter; • MouseMotionAdapter; • FocusAdapter; • WindowAdapter

  30. Имплементация. Събитиен модел Адаптерите изпълняват помощна роля: Когато броят на методите, дефинирани в интерфейса е голям, в адаптерните класове предварително е извършена “празна” реализация на методите (методите не съдържат код). В създавания клас, имплементиращ интерфейс, вместо да бъдат припокривани всички методи на интерфейса, достатъчно ще бъде да се наследи адаптерният клас и да се припокрият само онези методи, които са необходими в програмата.

  31. Имплементация. Събитиен модел За интерфейса ActionListener няма дефиниран адаптерен клас, понеже той дефинира само един единствен метод – actionPerformed(ActionEvent evt). Този метод трябва да се пренапише в новосъздаваните класове (да бъде припокриван).

  32. CRC карти за MVC Приложенията, основани на SWING се състоят от слушатели на събития за различните компоненти, използвани в начините на изобразяване

  33. CRC карти за MVC • Карти

  34. Рамкова програма на модела Всяко приложение се състои от: рамка с обозначение, работна област,меню, бутони Tool bar. В работната област се разполагат компоненти-текстови кутии, етикети, списъчни кутии бутони от различен тип и т.н. Пример (Bruce E. Wampler,The Essence of Object Oriented Programming with Java and UML,Addison-Wesley, 2001.) :

  35. Рамкова програма на модела • При реализацията може да се използва обща рамкова програма, реализирана с клас приложение-WmvcApp. Елементите са компонентите на интерфейса. Дефинирането на менютата става с обекти от тип JMenu и контролер за меню, а добавянето им с методаaddMenu. Същото важи и за JtoolBar. Добавянето на модел към приложението може да стане с предоставен метод – WmvcApp.SetModel. Стандартно е и затварянето на приложението.

  36. Рамкова програма на модела Пример Bruce E. Wampler,The Essence of Object Oriented Programming with Java and UML,Addison-Wesley, 2001:

  37. Моделиране на таблични интерфейсни класове с тeхнология SWING Таблични интерфейсни класове – същност Примерна имплементация на табличен модел: Създаване на таблицата String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian“ }; Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)}, {"Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true)}, {"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)} }; JTable table = new JTable(data, columnNames);

  38. Моделиране на таблични интерфейсни класове с тeхнология SWING Конструктори на JTable: JTable(Object[][] rowData, Object[] columnNames) JTable(Vector rowData, Vector columnNames)

  39. Моделиране на таблични интерфейсни класове с тeхнология SWING Поддържани функционалности по подразбиране: • Селектиране на ред: При избор натискане с мишка на поле; • Редактиране на данните в поле. Има маркировка, показваща редактируемите полета. Влизането в режима става с двойно натискане на мишка; • Разместване на колоните. С движение с натисната мишка може да се премества наляво/надясно от текущата му позиция всяка от колоните. Позволява да се променя структурата на таблицата; • Промяна в размера на колоната. С преместване на мишката в края на колона и натискане може да се промени ширината на колоната; • Смяна на размера на прозореца, ако е по-голям или по-малък от необходимия за изобразяване на данните от източника.

  40. Моделиране на таблични интерфейсни класове с тeхнология SWING Предимства на конструкторите е простотата на използване Недостатъци: • Всяка от клетките е редактируема. • Всички даннови типове се представят чрез низ. Това не е удачен вариант за тип Boolean. Таблицата може да ги представи като съвкупност от check box.При използването на горните конструктори, те се изобразяват като стрингове.

  41. Моделиране на таблични интерфейсни класове с тeхнология SWING Примери:

  42. Моделиране на таблични интерфейсни класове с тeхнология SWING • Изисква се всички данни за таблицата да са записани в конструиращите таблицата масив/вектор, което не е допустимо за някой данни. Например, ако източника на данните е база от данни, не може да се свърже директно като източник таблицата от базата, без да се копира междинно във вектор или масив. • За да се избягнат тези недостатъци се използва имплементация на собствен модел на таблицата

  43. Добавяне на таблицата в прозорец • Таблицата се поставя в скроливуем прозорец. Това е прозорец с вертикален скролиращ елемент. За да се включи таблицата в прозореца се използва следния код: JScrollPane scrollPane = new JScrollPane(table); table.setPreferredScrollableViewportSize( new Dimension(500, 70)); • Създадената таблица автоматично се разпознава и се създава със заглавна част, включваща имената на колоните в горната част на таблицата. Тя се запазва при преместване на редовете със скролиращия елемент. Размерите на колоните се оразмеряват в съответствие с поставените начални размерности на видимата част-параметрите на метода: setPreferredScrollableViewportSize.

  44. Добавяне на таблицата в прозорец Може да се използва таблица и без скролиращ прозорец, тогава се разполага заглавната част на таблицата с команди, например: container.setLayout(new BorderLayout());container.add(table.getTableHeader(), BorderLayout.PAGE_START);container.add(table, BorderLayout.CENTER);

  45. Установяване и смяна на ширината на колоните По подразбиране са с еднаква ширина, която се определя от ширината на таблицата. При потребителска промяна на общата големина на прозореца, всички колони се преоразмерават. Ако потребителят смени ширината на колона, всички останали колони си променят ширината в съответствие с новата ширина на колоната. По подразбиране, колоните надясно от тази, която се променя, сменят ширината си в съответствие с новата ширина на колоната. Общата ширина се запазва.

  46. Установяване и смяна на ширината на колоните Пример:

  47. Установяване и смяна на ширината на колоните За програмно променяне на ширната на колона може да се използва метода setPreferredWidth за всяка от колоните. Например, промяната на ширината на колона 2 може да се направи със следния примерен код: TableColumn column = null; for (int i = 0; i < 5; i++) { column = table.getColumnModel().getColumn(i); if (i == 2) { column.setPreferredWidth(100); //разширяване на 2 колона } else { column.setPreferredWidth(50); } } Колоната се представя чрез обекта TableColumn. Този обект има методи за четене/запис на минимална, текуща и максимална ширина

  48. Установяване на потребителска селекция Рамкова програма за демонстрация на обработката на потребителско селектиране на ред от таблицата. По подразбиране е възможно да се селектират повече от един ред. За да се ограничи избраната селекция до един ред в определен момент от време може да се използва следния код: table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ... //Получаване на модела на селектиране. ListSelectionModel rowSM = table.getSelectionModel();

  49. Установяване на потребителска селекция // добавяне на слушател за събитието селектиране на ред rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { //връща управлението при други събития if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) { ...//няма селектирани редове } else { int selectedRow = lsm.getMinSelectionIndex(); ...//получаване на един (първия) селектиран ред } } });

More Related