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

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

  • Upload
    latif

  • View
    66

  • Download
    4

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

SWING SWING

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

СъдържаниеСъдържание Особености на Модел-Начин на изобразяване-Контролер Особености на Модел-Начин на изобразяване-Контролер ( MVC) ( MVC) в в SwingSwing

– СъщностСъщност;;– Схема на моделаСхема на модела;;– Паралелизъм в архитектурата на MVC.Паралелизъм в архитектурата на MVC.

ИмплементацияИмплементация– Основни пакети;Основни пакети;– Йерархията на някои от класовете на JFC;Йерархията на някои от класовете на JFC;– Елементи;Елементи;– Събитиен модел;Събитиен модел;

CRC карти за MVCCRC карти за MVC– Рамкова програма на модела;Рамкова програма на модела;– Моделиране на таблични интерфейсниМоделиране на таблични интерфейсни

класове с тeхнология SWING; класове с тeхнология SWING; Моделиране на таблични интерфейсни класове с тeхнология SWINGМоделиране на таблични интерфейсни класове с тeхнология SWING

– Добавяне на таблицата в прозорец;Добавяне на таблицата в прозорец;– Установяване и смяна на ширината на колоните;Установяване и смяна на ширината на колоните;– Установяване на потребителска селекция;Установяване на потребителска селекция;

Изграждане на модел на таблицатаИзграждане на модел на таблицата– Редактори и интерпретатори на типовете;Редактори и интерпретатори на типовете;– Създаване на комбиниран списък за редакция на данни;Създаване на комбиниран списък за редакция на данни;– Валидизиране на потребителските данни;Валидизиране на потребителските данни;– Добавяне на подсказки;Добавяне на подсказки;

Връзка на таблица от базата данни с табличен интерфейс...Връзка на таблица от базата данни с табличен интерфейс...

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

Особености на Особености на MVC MVC в в Swing. Swing. СъщностСъщност

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

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

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

Схема на модела:Схема на модела:

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

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

Разделяне на отговорностите:Разделяне на отговорностите: Моделът отговаря за съхраняване на Моделът отговаря за съхраняване на

информацията за състоянието на компонента. информацията за състоянието на компонента. Общият делегиран потребителски интерфейс Общият делегиран потребителски интерфейс

е отговорен за начина на изобразяване и за е отговорен за начина на изобразяване и за потребителските въздействия с помощта на потребителските въздействия с помощта на пакета пакета AWTAWT..

Това разделяне определя двупосочната връзка Това разделяне определя двупосочната връзка между модела и общия елемент. между модела и общия елемент.

Предимство:Предимство: един и същ модел може да работи един и същ модел може да работи с много делегирани интерфейси – допуска се с много делегирани интерфейси – допуска се паралелизъм.паралелизъм.

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

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

Пример: Пример: Ако трябва да се изобразяват данни в Ако трябва да се изобразяват данни в

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

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

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

MVCMVCПаралелизъм:Паралелизъм:

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

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

MVCMVCНапример-документ:Например-документ: Редактиращо изобразяване; Редактиращо изобразяване; Изобразяване на печат; Изобразяване на печат; Отделни Отделни начини за изобразяваненачини за изобразяване на всяка от на всяка от

старниците на документа. старниците на документа. ВсВсеки потребителски интерфейсеки потребителски интерфейс се занимава с се занимава с

това, което трябва да знае за неговата това, което трябва да знае за неговата специфична специфична задачазадача, но всяко от тях , но всяко от тях взаимодейства с общия модел. Накрая всяко взаимодейства с общия модел. Накрая всяко изобразяване се свързва с потребителски изобразяване се свързва с потребителски интерфейс, реализиран посредством обекта интерфейс, реализиран посредством обекта контролер.контролер.

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

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

MVCMVCДействие:Действие: Моделът има N начина на изобразяване. Моделът Моделът има N начина на изобразяване. Моделът

е един, към който има множество начини на е един, към който има множество начини на изобразяване и асоциирани към тях класове изобразяване и асоциирани към тях класове контролер. контролер.

Контролерите получават потребителските Контролерите получават потребителските действия, като на всяко събитие, което е действия, като на всяко събитие, което е необходимо на приложението се изпраща необходимо на приложението се изпраща съобщение за промяна към модела. съобщение за промяна към модела.

Промяната на модела може да се предизвика и Промяната на модела може да се предизвика и от събития, получени от асинхронни промени в от събития, получени от асинхронни промени в базата от данни. Независимо от причината, базата от данни. Независимо от причината, когато моделът се промени, веднага се когато моделът се промени, веднага се уведомяват всички изобразявания и те се уведомяват всички изобразявания и те се преизобразяват. преизобразяват.

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

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

MVCMVCВ Java, контролера и изобразяването са В Java, контролера и изобразяването са

комбинирани. комбинирани. Това произтича от проекта на пакета за Това произтича от проекта на пакета за

интерфейс, например изучавания по интерфейс, например изучавания по дисциплината интерфейс Swing. дисциплината интерфейс Swing.

По този начин приложението се разделя По този начин приложението се разделя на на моделмодел и асоциирани и асоциирани View/ControllersView/Controllers, представени като , представени като интерфейсни компоненти на Swing и интерфейсни компоненти на Swing и техните слушатели ( техните слушатели ( listenerslisteners ). ).

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

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

MVCMVCНезависимо от фактическото изпълнение на Независимо от фактическото изпълнение на

View/Controllers, главната идея на MVC трябва да View/Controllers, главната идея на MVC трябва да отдели модела от изобразяването му на отдели модела от изобразяването му на потребителски интерфейс. потребителски интерфейс.

Предимства на подхода: Предимства на подхода: Моделът може да се разработи напълно Моделът може да се разработи напълно

независимо от начинанезависимо от начина, , по който ще се по който ще се изобразяваизобразява;;

При такава независимост на модела има голяма При такава независимост на модела има голяма гъвкавост при разработката на гъвкавост при разработката на начинитеначините, , които могат да се разработят за показване на които могат да се разработят за показване на модела;модела;

Новите представянияНовите представяния могат да се създават могат да се създават заедно с целия потребителски интерфейс и заедно с целия потребителски интерфейс и независимо от модела.независимо от модела.

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

ИмплементацияИмплементацияВ В Java View Java View и и ControllerController се представят от се представят от слушателите слушателите listenerslisteners. Предимствата на . Предимствата на обединението са независимостта на обединението са независимостта на разработване на модела от видовете разработване на модела от видовете изобразявания.изобразявания.

Потребителските интерфейси Потребителските интерфейси (GUI - Graphic (GUI - Graphic User Interface)User Interface) на аплетите съдържат на аплетите съдържат стандартни графични компоненти, стандартни графични компоненти, например: например: – бутони; бутони; – списъци; списъци; – менюта и др. менюта и др.

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

Имплементация. Основни пакетиИмплементация. Основни пакети

За изграждане на За изграждане на GUI Java 2 GUI Java 2 предлага пакети, предлага пакети, обединени под общото название JFC (обединени под общото название JFC (Java Java Foundation Classes)Foundation Classes). Основни пакети:. Основни пакети:

java.awtjava.awt. . Осигурява необходимата Осигурява необходимата инфраструктура на инфраструктура на GUI GUI и всички видове и всички видове GUI-GUI-компоненти.компоненти.

java.awt.eventjava.awt.event.. Реализира събитийния модел на Реализира събитийния модел на JavaJava. Осигурява обработката на събитията, . Осигурява обработката на събитията, генерирани в резултат от манипулациите на генерирани в резултат от манипулациите на потребителя с потребителя с GUIGUI, като например натискаане на , като например натискаане на бутон, придвижване на мишката и др.бутон, придвижване на мишката и др.

javax.swingjavax.swing. . Предлага нови, по-Предлага нови, по-усъвършенствани и по-естетични усъвършенствани и по-естетични GUI-GUI-компоненти в сравнение с компоненти в сравнение с java.awtjava.awt, наричани , наричани Swing-Swing-компоненти.компоненти.

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

Имплементация. Основни пакетиИмплементация. Основни пакети

Пакетите Пакетите javajava..awtawt и и javajava..awtawt..eventevent, заедно с пакета , заедно с пакета javajava..awtawt..datatransferdatatransfer, са , са известни под общото название известни под общото название AWTAWT ( (Abstract Window ToolkitAbstract Window Toolkit). В ). В Java Java 2 се използва версията 2 се използва версията AWT AWT 1.1. 1.1. Пакетът Пакетът javax.swingjavax.swing и още 15 и още 15 други пакета са известни под други пакета са известни под общото название общото название SwingSwing. .

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

Имплементация. Основни пакетиИмплементация. Основни пакети

Преди появата на Преди появата на SwingSwing, пакетите на , пакетите на AWTAWT осигуряват всички необходими осигуряват всички необходими GUI-GUI-компоненти. И компоненти. И днес те могат да се използват за това. днес те могат да се използват за това. Препоръчва се използване на Препоръчва се използване на Swing-Swing-компонентите като по-съвършени. Но компонентите като по-съвършени. Но Swing Swing не е не е заместител на заместител на AWT 1.1AWT 1.1. . Swing Swing е част от общия е част от общия GUI-GUI-инструментариум на инструментариум на JFCJFC. .

Имената на Имената на Swing-Swing-компонентите:компонентите: Образувани са от тези на Образувани са от тези на AWTAWT с началната им с началната им

буква буква “J”“J”. Например: . Например: AWTAWT ButtonButton - - Swing Swing JButtonJButton. . Компонентът Компонентът JAppletJApplet, подобно на , подобно на JFrameJFrame, ,

представлява контейнер от най-високо ниво. представлява контейнер от най-високо ниво. Swing-Swing-компонентите на аплетите се разполагат в компонентите на аплетите се разполагат в него. Той притежава четирислойна структура от него. Той притежава четирислойна структура от повърхности, от които за програмистът най-повърхности, от които за програмистът най-важен е четвъртият слой, наричан важен е четвъртият слой, наричан content panecontent pane..

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

Имплементация. Основни Имплементация. Основни пакетипакети

Пример: Един бутон се разполага в Пример: Един бутон се разполага в JAppletJApplet чрез следния код:чрез следния код:

JApplet applet = new JApplet();JApplet applet = new JApplet();. . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . .Container contentPane = Container contentPane =

applet.getContentPane();applet.getContentPane();JButton button = new JButton(“OK”);JButton button = new JButton(“OK”);contentPane.add(button);contentPane.add(button);

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

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

на JFC на JFC

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

Имплементация. ЕлементиИмплементация. ЕлементиВърху Върху content panecontent pane могат да се могат да се

разполагат и панели. Те се създават разполагат и панели. Те се създават посредством класа посредством класа JPanelJPanel. Панелите . Панелите се характеризират с две свойства:се характеризират с две свойства:

притежават повърхност, върху която притежават повърхност, върху която може да се изобразява текст и може да се изобразява текст и графика;графика;

те са контейнери, които също биха те са контейнери, които също биха могли да съдържат в себе си могли да съдържат в себе си GUI-GUI-компоненти.компоненти.

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

Имплементация. ЕлементиИмплементация. Елементи

Включване на панел в контейнер от Включване на панел в контейнер от тип тип JAppletJApplet се извършва по се извършва по следния начин:следния начин:

Container contentPane = Container contentPane = applet.getContentPane();applet.getContentPane();

JPanel panel = new JPanel();JPanel panel = new JPanel();contentPane.add(panel);contentPane.add(panel);

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

Имплементация. Събитиен Имплементация. Събитиен моделмодел

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

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

Имплементация. Събитиен Имплементация. Събитиен моделмодел

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

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

Имплементация. Събитиен Имплементация. Събитиен моделмодел

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

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

Имплементация. Събитиен Имплементация. Събитиен моделмодел

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

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

Имплементация. Събитиен Имплементация. Събитиен моделмоделЗа всеки обработчик За всеки обработчик ((слушателслушател) ) на събития трябва да са на събития трябва да са

изпълнени три условия:изпълнени три условия: Слушателят за определен вид събитие трябва да бъде Слушателят за определен вид събитие трябва да бъде

обект на клас, който реализира интерфейс, съответстващ обект на клас, който реализира интерфейс, съответстващ на този вид събитие. Такъв тип интерфейси, на този вид събитие. Такъв тип интерфейси, предназначени за събития, биват наричани с общото предназначени за събития, биват наричани с общото название название интерфейси за подслушванеинтерфейси за подслушване (listener interface). В (listener interface). В декларацията на класа на слушателя следва да се укаже, декларацията на класа на слушателя следва да се укаже, че класът че класът имплементираимплементира нужния интерфейс за нужния интерфейс за подслушване, като например:подслушване, като например:

public class MyClass implements ActionListener { . . . }public class MyClass implements ActionListener { . . . }или пък че наследява клас, който реализира същия интерфейс.:или пък че наследява клас, който реализира същия интерфейс.: Обработчикът Обработчикът ((слушателятслушателят)) следва да е регистриран в следва да е регистриран в

източника на събитието. Осъществява се по следния източника на събитието. Осъществява се по следния примерен начин:примерен начин:

button.addActionListener(button.addActionListener(референция на обекта-слушател на референция на обекта-слушател на MyClass);MyClass);

В класа на обекта-слушател В класа на обекта-слушател ((в случая в в случая в MyClass)MyClass) трябва да трябва да са припокрити методите на слушателския интерфейс:са припокрити методите на слушателския интерфейс:

public void actionPerformed(ActionEvent e) {public void actionPerformed(ActionEvent e) {// // Код, обработващ събитиетоКод, обработващ събитието

}}

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

Имплементация. Събитиен Имплементация. Събитиен моделмодел

Пример, в който обект на класа Пример, в който обект на класа MyClassMyClass, представен чрез , представен чрез thisthis,, бива регистриран в обекта бива регистриран в обекта buttonbutton, който е източник , който е източник на събития от тип на събития от тип ActionEventActionEvent::

public class MyClass extends JApplet implements ActionListener {public class MyClass extends JApplet implements ActionListener {MyClass() { // MyClass() { // КонструкторКонструктор. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . .button.addActionListener(this);button.addActionListener(this);. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }}public void actionPerformed(ActionEvent e) {public void actionPerformed(ActionEvent e) {. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . .}}. . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . .

}}

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

Имплементация. Събитиен Имплементация. Събитиен моделмодел

Често пъти слушателите се реализират чрез анонимни Често пъти слушателите се реализират чрез анонимни класове класове ((класове, дефинирани вътре в други класовекласове, дефинирани вътре в други класове)). . В този случай в декларацията на потребителския клас В този случай в декларацията на потребителския клас не е необходимо да се указва, че той реализира не е необходимо да се указва, че той реализира слушателския интерфейс. Примерслушателския интерфейс. Пример::

public class MyClass extends JApplet {public class MyClass extends JApplet {. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . .button.addActionListener(new ActionListener() {button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {public void actionPerformed(ActionEvent e) {. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .

}}});});. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .

}}

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

Имплементация. Събитиен моделИмплементация. Събитиен модел

Интерфейсът Интерфейсът ActionListenerActionListener сесе използва за събития, възникнали в използва за събития, възникнали в резултат на: резултат на:

натискане на бутон на мишката; натискане на бутон на мишката; след натискане на клавиша <Enter> след натискане на клавиша <Enter>

в края на въведен текст (в текстово в края на въведен текст (в текстово поле от тип поле от тип JTextFieldJTextField); );

след избор на елемент от меню. след избор на елемент от меню.

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

Имплементация. Събитиен моделИмплементация. Събитиен моделВ пакета В пакета java.awt.eventjava.awt.event се съдържат общо 11 основни слушателски се съдържат общо 11 основни слушателски

интерфейса:интерфейса: ActionListenerActionListener-actionPerformed( );-actionPerformed( ); AdjustmentListenerAdjustmentListener-adjustmentValue-Changed( );-adjustmentValue-Changed( ); ComponentListenerComponentListener

– componentResized( )componentResized( )– componentMoved( )componentMoved( )– componentShown( )componentShown( )– componentHidden( );componentHidden( );

ContainerListenerContainerListener-componentAdded( ), componentRemoved( );-componentAdded( ), componentRemoved( ); KeyListenerKeyListener-клавиатура: keyTyped( ),keyPressed( ),keyReleased( );-клавиатура: keyTyped( ),keyPressed( ),keyReleased( ); MouseListenerMouseListener-бутони и др.;-бутони и др.; MouseMotionListenerMouseMotionListener-за движения:mouseDragged( ), mouseMoved( -за движения:mouseDragged( ), mouseMoved(

);); MenuListener-menuCanceled( ),menuDeselected( ),menuSelected( );MenuListener-menuCanceled( ),menuDeselected( ),menuSelected( ); FocusListenerFocusListener-focusGained( ), focusLost( );-focusGained( ), focusLost( ); ItemListenerItemListener-itemStateChanged( );-itemStateChanged( ); WindowListenerWindowListener:windowOpened( ),windowClosing( ),windowClosed( :windowOpened( ),windowClosing( ),windowClosed(

)) ... ...

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

Имплементация. Събитиен моделИмплементация. Събитиен модел

Онези от тях, които съдържат по-голям Онези от тях, които съдържат по-голям брой методи, са разширени с брой методи, са разширени с адаптерни адаптерни класовекласове: :

ComponentAdapterComponentAdapter;; ContainerAdapterContainerAdapter;; KeyAdapterKeyAdapter;; MouseAdapterMouseAdapter;; MouseMotionAdapterMouseMotionAdapter;; FocusAdapterFocusAdapter;; WindowAdapterWindowAdapter

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

Имплементация. Събитиен моделИмплементация. Събитиен модел

Адаптерите изпълняват помощна роля:Адаптерите изпълняват помощна роля: Когато броят на методите, дефинирани в Когато броят на методите, дефинирани в

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

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

Имплементация. Събитиен моделИмплементация. Събитиен модел

За интерфейса За интерфейса ActionListenerActionListener няма няма дефиниран адаптерен клас, дефиниран адаптерен клас, понеже той дефинира само един понеже той дефинира само един единствен метод – единствен метод – actionPerformedactionPerformed((ActionEvent ActionEvent evtevt)). Този метод трябва да се . Този метод трябва да се пренапише в новосъздаваните пренапише в новосъздаваните класове (да бъде припокриван).класове (да бъде припокриван).

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

CRC CRC карти за карти за MVCMVC Приложенията, основани на Приложенията, основани на SWINGSWING

се състоят от слушатели на се състоят от слушатели на събития за различните събития за различните компоненти, използвани в компоненти, използвани в начините на изобразяване начините на изобразяване

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

CRC CRC карти за карти за MVCMVC КартиКарти

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

Рамкова програма на моделаРамкова програма на моделаВсяко приложение се състои от: Всяко приложение се състои от: рамка с обозначение, работна област,меню, бутони рамка с обозначение, работна област,меню, бутони Tool barTool bar. . В В

работната област се разполагат компоненти-текстови работната област се разполагат компоненти-текстови кутии, етикети, списъчни кутии бутони от различен тип и кутии, етикети, списъчни кутии бутони от различен тип и т.н. Пример (т.н. Пример (Bruce E. Wampler,The Essence of Object Oriented Bruce E. Wampler,The Essence of Object Oriented Programming with Java and UML,Addison-Wesley, 200Programming with Java and UML,Addison-Wesley, 20011..) :) :

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

Рамкова програма на моделаРамкова програма на модела

При реализацията може да се използва При реализацията може да се използва обща рамкова програма, реализирана с обща рамкова програма, реализирана с клас приложение-клас приложение-WmvcAppWmvcApp. . Елементите Елементите са компонентите на интерфейса. са компонентите на интерфейса. Дефинирането на менютата става с Дефинирането на менютата става с обекти от тип обекти от тип JMenuJMenu и контролер за меню и контролер за меню, , а добавянето им с методаа добавянето им с метода addMenuaddMenu. . Същото важи и за Същото важи и за JtoolBarJtoolBar. . Добавянето на Добавянето на модел към приложението може да стане с модел към приложението може да стане с предоставен метод – предоставен метод – WmvcAppWmvcApp..SetModelSetModel. . Стандартно е и затварянето на Стандартно е и затварянето на приложението. приложението.

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

Рамкова програма на моделаРамкова програма на моделаПример Пример Bruce E. Wampler,The Essence of Object Oriented Bruce E. Wampler,The Essence of Object Oriented

Programming with Java and UML,Addison-Wesley, 200Programming with Java and UML,Addison-Wesley, 2001:1:

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

Моделиране на таблични Моделиране на таблични интерфейсниинтерфейсни

класове с тeхнология SWING класове с тeхнология SWINGТаблични интерфейсни класове – същностТаблични интерфейсни класове – същностПримерна имплементация на табличен модел:Примерна имплементация на табличен модел:

Създаване на таблицатаСъздаване на таблицатаString[] columnNames = {String[] columnNames = {"First Name", "First Name", "Last Name", "Last Name", "Sport", "Sport", "# of Years", "# of Years", "Vegetarian“"Vegetarian“};};

Object[][] data = { Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new {"Mary", "Campione", "Snowboarding", new Integer(5), new

Boolean(false)},Boolean(false)},{"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)}, {"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)}, {"Sharon", "Zakhour", "Speed reading", new Integer(20), new {"Sharon", "Zakhour", "Speed reading", new Integer(20), new

Boolean(true)},Boolean(true)},{"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)}{"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)}};}; JTable table = new JTable(data, columnNames);JTable table = new JTable(data, columnNames);

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

Моделиране на таблични Моделиране на таблични интерфейсниинтерфейсни

класове с тeхнология SWING класове с тeхнология SWINGКонструктори наКонструктори на JTable: JTable: JTable(Object[][] rowData, Object[] JTable(Object[][] rowData, Object[]

columnNames) columnNames) JTable(Vector rowData, Vector JTable(Vector rowData, Vector

columnNames) columnNames)

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

Моделиране на таблични Моделиране на таблични интерфейсниинтерфейсни

класове с тeхнология SWING класове с тeхнология SWINGПоддържани функционалности по подразбиране:Поддържани функционалности по подразбиране: Селектиране на ред: При избор натискане с мишка на Селектиране на ред: При избор натискане с мишка на

поле;поле; Редактиране на данните в поле. Има маркировка, Редактиране на данните в поле. Има маркировка,

показваща редактируемите полета. Влизането в показваща редактируемите полета. Влизането в режима става с двойно натискане на мишка;режима става с двойно натискане на мишка;

Разместване на колоните. С движение с натисната Разместване на колоните. С движение с натисната мишка може да се премества наляво/надясно от мишка може да се премества наляво/надясно от текущата му позиция всяка от колоните. Позволява текущата му позиция всяка от колоните. Позволява да се променя структурата на таблицата;да се променя структурата на таблицата;

Промяна в размера на колоната. С преместване на Промяна в размера на колоната. С преместване на мишката в края на колона и натискане може да се мишката в края на колона и натискане може да се промени ширината на колоната;промени ширината на колоната;

Смяна на размера на прозореца, ако е по-голям или Смяна на размера на прозореца, ако е по-голям или по-малък от необходимия за изобразяване на данните по-малък от необходимия за изобразяване на данните от източника.от източника.

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

Моделиране на таблични Моделиране на таблични интерфейсниинтерфейсни

класове с тeхнология SWING класове с тeхнология SWINGПредимства на конструкторите е Предимства на конструкторите е

простотата на използванепростотата на използванеНедостатъциНедостатъци: : Всяка от клетките е редактируемаВсяка от клетките е редактируема. . Всички даннови типове се представят Всички даннови типове се представят

чрез низчрез низ. . Това не е удачен вариант за Това не е удачен вариант за тип тип BooleanBoolean. Таблицата може да ги . Таблицата може да ги представи като съвкупност от представи като съвкупност от check boxcheck box.. При използването на горните При използването на горните конструкториконструктори , те се изобразяват като , те се изобразяват като стринговестрингове..

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

Моделиране на таблични Моделиране на таблични интерфейсниинтерфейсни

класове с тeхнология SWING класове с тeхнология SWINGПримери:Примери:

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

Моделиране на таблични Моделиране на таблични интерфейсниинтерфейсни

класове с тeхнология SWING класове с тeхнология SWING Изисква се всички данни за таблицата да Изисква се всички данни за таблицата да

са записани в конструиращите таблицата са записани в конструиращите таблицата масив/вектор, което не е допустимо за масив/вектор, което не е допустимо за някой данни. Например, ако източника на някой данни. Например, ако източника на данните е база от данни, не може да се данните е база от данни, не може да се свърже директно като източник свърже директно като източник таблицата от базата, без да се копира таблицата от базата, без да се копира междинно във вектор или масивмеждинно във вектор или масив. .

За да се избягнат тези недостатъци се За да се избягнат тези недостатъци се използва имплементация на собствен използва имплементация на собствен модел на таблицатамодел на таблицата

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

Добавяне на таблицата в прозорецДобавяне на таблицата в прозорец Таблицата се поставя в скроливуем прозорец. Това е Таблицата се поставя в скроливуем прозорец. Това е

прозорец с вертикален скролиращ елемент. За да се прозорец с вертикален скролиращ елемент. За да се включи таблицата в прозореца се използва следния код:включи таблицата в прозореца се използва следния код:

JScrollPane scrollPane = new JScrollPane(table);JScrollPane scrollPane = new JScrollPane(table);table.setPreferredScrollableViewportSize(table.setPreferredScrollableViewportSize(

new Dimension(500, 70));new Dimension(500, 70));

Създадената таблица автоматично се разпознава и се Създадената таблица автоматично се разпознава и се създава със заглавна част, включваща имената на създава със заглавна част, включваща имената на колоните в горната част на таблицата. Тя се запазва при колоните в горната част на таблицата. Тя се запазва при преместване на редовете със скролиращия елемент. преместване на редовете със скролиращия елемент. Размерите на колоните се оразмеряват в съответствие с Размерите на колоните се оразмеряват в съответствие с поставените начални размерности на видимата част-поставените начални размерности на видимата част-параметрите на метода:параметрите на метода:

setPreferredScrollableViewportSize. setPreferredScrollableViewportSize.

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

Добавяне на таблицата в прозорецДобавяне на таблицата в прозорец

Може да се използва таблица и без Може да се използва таблица и без скролиращ прозорец, тогава се скролиращ прозорец, тогава се разполага заглавната част на таблицата разполага заглавната част на таблицата с команди, например:с команди, например:

container.setLayout(new container.setLayout(new

BorderLayout());container.add(table.gBorderLayout());container.add(table.getTableHeader(), etTableHeader(), BorderLayout.PAGE_START);BorderLayout.PAGE_START);container.container.add(table, BorderLayout.CENTER);add(table, BorderLayout.CENTER);

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

Установяване и смяна на ширината Установяване и смяна на ширината на колонитена колоните

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

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

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

Установяване и смяна на ширината Установяване и смяна на ширината на колонитена колоните

Пример:Пример:

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

Установяване и смяна на ширината Установяване и смяна на ширината на колонитена колоните

За програмно променяне на ширната на колона може да се За програмно променяне на ширната на колона може да се използва метода setPreferredWidth за всяка от колоните. използва метода setPreferredWidth за всяка от колоните. Например, промяната на ширината на колона 2 може да Например, промяната на ширината на колона 2 може да се направи със следния примерен код: се направи със следния примерен код:

TableColumn column = null;TableColumn column = null;for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) { column = table.getColumnModel().getColumn(i); column = table.getColumnModel().getColumn(i); if (i == 2) { if (i == 2) { column.setPreferredWidth(100); //разширяване на 2 column.setPreferredWidth(100); //разширяване на 2

колона колона } else { } else { column.setPreferredWidth(50); column.setPreferredWidth(50); }}}}Колоната се представя чрез обекта Колоната се представя чрез обекта TableColumn.TableColumn. Този Този

обект има методи за четене/запис на минимална, текуща обект има методи за четене/запис на минимална, текуща и максимална ширина и максимална ширина

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

Установяване на потребителска Установяване на потребителска селекцияселекция

Рамкова програма за демонстрация на Рамкова програма за демонстрация на обработката на потребителско обработката на потребителско селектиране на ред от таблицата. По селектиране на ред от таблицата. По подразбиране е възможно да се подразбиране е възможно да се селектират повече от един ред. За да се селектират повече от един ред. За да се ограничи избраната селекция до един ограничи избраната селекция до един ред в определен момент от време може ред в определен момент от време може да се използва следния код:да се използва следния код:

table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);......//Получаване на модела на селектиране.//Получаване на модела на селектиране.ListSelectionModel rowSM = table.getSelectionModel();ListSelectionModel rowSM = table.getSelectionModel();

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

Установяване на потребителска Установяване на потребителска селекцияселекция

// добавяне на слушател за събитието селектиране на ред// добавяне на слушател за събитието селектиране на ред

rowSM.addListSelectionListener(new ListSelectionListener() {rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) {public void valueChanged(ListSelectionEvent e) { //връща управлението при други събития//връща управлението при други събития if (e.getValueIsAdjusting()) return;if (e.getValueIsAdjusting()) return;

ListSelectionModel lsm =ListSelectionModel lsm = (ListSelectionModel)e.getSource();(ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) {if (lsm.isSelectionEmpty()) { ...//няма селектирани редове...//няма селектирани редове } else {} else { int selectedRow = lsm.getMinSelectionIndex();int selectedRow = lsm.getMinSelectionIndex(); ...//получаване на един (първия) селектиран ред...//получаване на един (първия) селектиран ред }} }}});});

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

Изграждане на модел на таблицатаИзграждане на модел на таблицатаАлтернатива на подразбиращият се начин на Алтернатива на подразбиращият се начин на

изобразяване на таблицата е изграждането на собствен изобразяване на таблицата е изграждането на собствен модел. Този подход е по- гъвкав и позволява да се модел. Този подход е по- гъвкав и позволява да се изграждат таблични интерфейси с потребителски изграждат таблични интерфейси с потребителски дефинирани типове колони. дефинирани типове колони.

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

Изграждане на модел на таблицатаИзграждане на модел на таблицатаВ смисъла на моделното представяне стандартния В смисъла на моделното представяне стандартния

конструктор на таблицата може да се представи по конструктор на таблицата може да се представи по следния начин:следния начин:

new AbstractTableModel() {new AbstractTableModel() { public String getColumnName(int col) {public String getColumnName(int col) { return columnNames[col].toString();return columnNames[col].toString(); }} public int getRowCount() { return rowData.length; }public int getRowCount() { return rowData.length; } public int getColumnCount() { return columnNames.length; }public int getColumnCount() { return columnNames.length; } public Object getValueAt(int row, int col) {public Object getValueAt(int row, int col) { return rowData[row][col];return rowData[row][col]; }} public boolean isCellEditable(int row, int col)public boolean isCellEditable(int row, int col) { return true; }{ return true; } public void setValueAt(Object value, int row, int col) {public void setValueAt(Object value, int row, int col) { rowData[row][col] = value;rowData[row][col] = value; fireTableCellUpdated(row, col);fireTableCellUpdated(row, col); }}}}

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

Изграждане на модел на таблицатаИзграждане на модел на таблицата Имплементирането на модел на таблицата може да стане с Имплементирането на модел на таблицата може да стане с

използването на класа използването на класа AbstractTableModelAbstractTableModel като базов клас на като базов клас на модела, който да разшри неговите методи. Източник на данни за модела, който да разшри неговите методи. Източник на данни за модела могат да бъдат както източниците на обикновенния модела могат да бъдат както източниците на обикновенния табличен модел, така и други, например хеширана таблица или база табличен модел, така и други, например хеширана таблица или база от данни. Това позволява да се генерират данните в процеса на от данни. Това позволява да се генерират данните в процеса на изпълнениеизпълнение . Предимства: . Предимства:

Позволява да се създаде собствен модел за типовете данни, който Позволява да се създаде собствен модел за типовете данни, който да извежда данните в по-удобен формат. Може да се разграничават да извежда данните в по-удобен формат. Може да се разграничават различни типове данни, например в колоната различни типове данни, например в колоната # of Years# of Years да се да се подразбират числови данни, а не подразбиращите се низове за подразбират числови данни, а не подразбиращите се низове за всички колони. В колоната Vegetarian логическите типове данни всички колони. В колоната Vegetarian логическите типове данни могат да се представят с колона от бутони check boxes. могат да се представят с колона от бутони check boxes.

В някои от колоните може да се забрани редактиращият режим, В някои от колоните може да се забрани редактиращият режим, който се подразбира при стандартния модел на таблицата. който се подразбира при стандартния модел на таблицата.

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

Изграждане на модел на таблицатаИзграждане на модел на таблицата//пример за създаване чрез класа MyTableModel//пример за създаване чрез класа MyTableModelpublic TableDemo() {public TableDemo() { ...... JTable table = new JTable(new MyTableModel());JTable table = new JTable(new MyTableModel()); ......}}// дефиниция на класа// дефиниция на класаclass MyTableModel extends AbstractTableModel {class MyTableModel extends AbstractTableModel { private String[] columnNames = ...//инициализация на имена private String[] columnNames = ...//инициализация на имена

на колоните...на колоните... private Object[][] data = ...//инициализация на данните...private Object[][] data = ...//инициализация на данните...

public int getColumnCount() { return columnNames.length; }public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; }public int getRowCount() { return data.length; } public String getColumnName(int col) { return public String getColumnName(int col) { return

columnNames[col]; }columnNames[col]; } public Object getValueAt(int row, int col) { public Object getValueAt(int row, int col) {

return data[row][col]; return data[row][col]; }}

(продължава)(продължава)

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

Изграждане на модел на таблицатаИзграждане на модел на таблицата// добавяне на метод за получаване на класа на колоната// добавяне на метод за получаване на класа на колоната public Class getColumnClass(int c) {public Class getColumnClass(int c) { return getValueAt(0, c).getClass();return getValueAt(0, c).getClass(); }} // забрана на редантирането на първите 2 колони// забрана на редантирането на първите 2 колони public boolean isCellEditable(int row, int col) {public boolean isCellEditable(int row, int col) { if (col < 2) {if (col < 2) { return false;return false; } else {} else { return true;return true; }} }}// Метод за промяна на данните на подадения ред/колона.// Метод за промяна на данните на подадения ред/колона. public void setValueAt(Object value, int row, int col) {public void setValueAt(Object value, int row, int col) { data[row][col] = value;data[row][col] = value; fireTableCellUpdated(row, col);fireTableCellUpdated(row, col); }} ......}}

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

Редактори и интерпретатори на Редактори и интерпретатори на типовететиповете

Стандартно извеждане на данните на Стандартно извеждане на данните на таблицата. таблицата.

При извеждане на клетка от таблицата, При извеждане на клетка от таблицата, стандартният начин на извеждане не стандартният начин на извеждане не имплементира всяка от клетките като имплементира всяка от клетките като самостоятелен елемент. Всички самостоятелен елемент. Всички еднотипови елементи се имплементират по еднотипови елементи се имплементират по един и същ начин. Причината е един и същ начин. Причината е бързодействието...бързодействието... Интерпретаторът на клетките се Интерпретаторът на клетките се използва за всички еднотипови клетки използва за всички еднотипови клетки на таблицата.на таблицата.

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

Редактори и интерпретатори на Редактори и интерпретатори на типовететиповете

Използване на типовете при извеждането Използване на типовете при извеждането на данните в таблицата. на данните в таблицата. Това се използва за указване на Това се използва за указване на интерпретатора как да форматира данните интерпретатора как да форматира данните в колоните или отделните клетки. Формата в колоните или отделните клетки. Формата на извеждане използва тази информация на извеждане използва тази информация при интерфейсното въздействие на при интерфейсното въздействие на потребителя. Така редакторът на клетката потребителя. Така редакторът на клетката се информира за начина на работа с нея и се информира за начина на работа с нея и за контрола на потребителските действия.за контрола на потребителските действия.

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

Редактори и интерпретатори на Редактори и интерпретатори на типовететиповете

Например, може да се укаже, че колоната Например, може да се укаже, че колоната # of Years# of Years на TableDemo съдържа на TableDemo съдържа числови данни — например обект от тип числови данни — например обект от тип Integer. Подразбира се, че тези данни са Integer. Подразбира се, че тези данни са дясно подравнени и се използва този дясно подравнени и се използва този (подразбиращ се за числата) начин на (подразбиращ се за числата) начин на изобразяване/редактиране при изобразяване/редактиране при потребителски въздействия на клетките потребителски въздействия на клетките от колоната. Това важи за всички данни от колоната. Това важи за всички данни от колоната. от колоната.

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

Редактори и интерпретатори на Редактори и интерпретатори на типовететиповете

Последователност при избор на интерпретация Последователност при избор на интерпретация при извеждане на колоната:при извеждане на колоната:

Проверява дали е създаден специален Проверява дали е създаден специален дефиниран интерпретатор за колоната;дефиниран интерпретатор за колоната;

Ако няма такъв, извиква метод на модела за Ако няма такъв, извиква метод на модела за получаване на класа на колонта- получаване на класа на колонта- getColumnClass,getColumnClass, като се получава типа на като се получава типа на данните на колоната;данните на колоната;

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

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

Редактори и интерпретатори на Редактори и интерпретатори на типовететиповете

Предефинирани типове в таблиците:Предефинирани типове в таблиците: BooleanBoolean — изобразяване като списък — изобразяване като списък check boxcheck box. . NumberNumber — — като дясно подравнени при извеждането като дясно подравнени при извеждането

данни;данни; DoubleDouble, , FloatFloat — — подобно наподобно на NumberNumber, , но преобразуването но преобразуването

на обект към текстовото му представяне се на обект към текстовото му представяне се преформатира в съответствие с инстанция на преформатира в съответствие с инстанция на NumberFormatNumberFormat, , като се използва избраният на локалния като се използва избраният на локалния потребител начин на извеждане на реалните числа;потребител начин на извеждане на реалните числа;

Date — Date — форматира се като стринг, използвайки форматира се като стринг, използвайки инстанция на инстанция на DateFormat DateFormat по къс форматен стил на по къс форматен стил на датата, настроен в локалния потребител;датата, настроен в локалния потребител;

ImageIcon, Icon — ImageIcon, Icon — центрираноцентрирано. . ObjectObject — — форматира се като текст, използвайки форматира се като текст, използвайки

стринговата интерпретация на обектастринговата интерпретация на обекта. .

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

Редактори и интерпретатори на Редактори и интерпретатори на типовететиповете

При редактиране При редактиране на клетка на клетка се използва подобен се използва подобен алгоритъм.алгоритъм.

При създаване на собствен модел, той При създаване на собствен модел, той използва класа Object като тип на всяка колона. използва класа Object като тип на всяка колона. За да се разграничи типа на колоната се За да се разграничи типа на колоната се използва методът getColumnClass. използва методът getColumnClass.

Установяването на интерпретатори на типовете Установяването на интерпретатори на типовете определя как се извежда клетката и заглавната определя как се извежда клетката и заглавната част на страницата, но не дефинира част на страницата, но не дефинира обработката на събитията, които потребителя е обработката на събитията, които потребителя е предизвикал. Ако трябва да се обработват предизвикал. Ако трябва да се обработват събития от потребителя – редактиране, събития от потребителя – редактиране, селектиране, позиция на мишката върху селектиране, позиция на мишката върху заглавие или други трябва да се използват заглавие или други трябва да се използват описаните в следващата таблицата описаните в следващата таблицата предефинирани обработкипредефинирани обработки

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

Редактори и интерпретатори на Редактори и интерпретатори на типовететиповете

Събитие Обработка Редактиране на данни от клетка в таблицата (двойно натискане на мишката)

Използва се редактор на клетка или се регистрираслушател на събития.

Селектиране или деселектиране на ред/колона или клетка от таблицат

Използва се слушател на селектиране.

Събитие позициониране на мишката върху колона от таблицата

Регистрира се слушател на мишката за обект от JTableHeader. (например за сортиране на данните може да се използва такъв слушател.)

Други събития Регистрира се слушател на обекта JTable.

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

Създаване на потребителски Създаване на потребителски дефиниран интерпретатор на дефиниран интерпретатор на

клеткаклеткаНай-простият вариант е да се промени Най-простият вариант е да се промени

начинът на извеждане на текста в начинът на извеждане на текста в полето или изображението като се полето или изображението като се наследи класът наследи класът DefaultTableCellRenderer. DefaultTableCellRenderer.

Създава се наследник, който Създава се наследник, който имплементира метода setText в имплементира метода setText в подходящ за променените даннови подходящ за променените даннови типоветипове

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

Създаване на потребителски Създаване на потребителски дефиниран интерпретатор на дефиниран интерпретатор на

клеткаклеткаПример за форматиране на дата с използване на Пример за форматиране на дата с използване на

класа: класа: static class DateRenderer extends static class DateRenderer extends

DefaultTableCellRenderer {DefaultTableCellRenderer { DateFormat formatter;DateFormat formatter; public DateRenderer() { super(); }public DateRenderer() { super(); } public void public void setValue(setValue(Object value) {Object value) { if (formatter==null) {if (formatter==null) { formatter = DateFormat.getDateInstance();formatter = DateFormat.getDateInstance(); }} setText((value == null) ? "" : setText((value == null) ? "" :

formatter.format(value));formatter.format(value)); }}}}

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

Създаване на комбиниран списък за Създаване на комбиниран списък за редакция на данниредакция на данни

Пример за установяване на комбиниран списък за Пример за установяване на комбиниран списък за редактиране на колона 2:редактиране на колона 2:

// получаване на колоната// получаване на колонатаTableColumn sportColumn = TableColumn sportColumn =

table.getColumnModel().getColumn(2);table.getColumnModel().getColumn(2);......// създаване на комбинирания списък от стойности// създаване на комбинирания списък от стойностиJComboBox comboBox = new JComboBox();JComboBox comboBox = new JComboBox();comboBox.addItem("Snowboarding");comboBox.addItem("Snowboarding");comboBox.addItem("Rowing");comboBox.addItem("Rowing");comboBox.addItem("Chasing toddlers");comboBox.addItem("Chasing toddlers");comboBox.addItem("Speed reading");comboBox.addItem("Speed reading");comboBox.addItem("Teaching high school");comboBox.addItem("Teaching high school");comboBox.addItem("None");comboBox.addItem("None");sportColumn.setCellEditor(new DefaultCellEditor(comboBox));sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

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

Създаване на комбиниран списък за Създаване на комбиниран списък за редакция на данниредакция на данни

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

Валидизиране на потребителските Валидизиране на потребителските данниданни

При използване на подразбиращ се редактор, При използване на подразбиращ се редактор, потребителят може да въвежда произволен текст. потребителят може да въвежда произволен текст. Например, ако колоната е от тип Integer, при въвеждане Например, ако колоната е от тип Integer, при въвеждане на низ "123" се създава инстанция с new Integer("123"). на низ "123" се създава инстанция с new Integer("123"). За контролиране на потребителския вход се използват За контролиране на потребителския вход се използват контролиращи редактори на данните. контролиращи редактори на данните.

Пример за установяване на такъв редактор при тип Integer. Пример за установяване на такъв редактор при тип Integer. table.setDefaultEditor(Integer.class, table.setDefaultEditor(Integer.class, new IntegerEditor(0, 100)); new IntegerEditor(0, 100)); Класът Класът IntegerEditor IntegerEditor е имплементация на подразбиращия е имплементация на подразбиращия

се редактор DefaultCellEditor и използва се редактор DefaultCellEditor и използва JFormattedTextField JFormattedTextField вместо вместо JTextField JTextField който се поддържа който се поддържа от от DefaultCellEditorDefaultCellEditor. Той осигурява форматирането на . Той осигурява форматирането на клетката във цялочислен формат и определя границите клетката във цялочислен формат и определя границите minmin и и maxmax на въвежданите числа. Допълнителна на въвежданите числа. Допълнителна информация за създаване на валидизиращи класове информация за създаване на валидизиращи класове може да се получи на адрес: може да се получи на адрес: http://java.sun.com/docs/books/tutorial/uiswing/components/http://java.sun.com/docs/books/tutorial/uiswing/components/

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

Добавяне на подсказкиДобавяне на подсказкиЗа да се добави подсказващ текст първо се създава За да се добави подсказващ текст първо се създава

интерпретатор на полето. Необходимо е да се имплементира интерпретатор на полето. Необходимо е да се имплементира метода getToolTipText(MouseEvent) метода getToolTipText(MouseEvent)

JTable table = new JTable(new MyTableModel()) { JTable table = new JTable(new MyTableModel()) { //Имплементация на метода.//Имплементация на метода. public String getToolTipText(MouseEvent e) {public String getToolTipText(MouseEvent e) {// установяване на индекса на колоната// установяване на индекса на колоната String tip = null;String tip = null; java.awt.Point p = e.getPoint();java.awt.Point p = e.getPoint(); int rowIndex = rowAtPoint(p);int rowIndex = rowAtPoint(p); int colIndex = columnAtPoint(p);int colIndex = columnAtPoint(p); int realColumnIndex = convertColumnIndexToModel(colIndex);int realColumnIndex = convertColumnIndexToModel(colIndex);

if (realColumnIndex == 4) { //логическа (вегитарианец?)if (realColumnIndex == 4) { //логическа (вегитарианец?) TableModel model = getModel();TableModel model = getModel(); String firstName = (String)model.getValueAt(rowIndex,0);String firstName = (String)model.getValueAt(rowIndex,0); String lastName = (String)model.getValueAt(rowIndex,1);String lastName = (String)model.getValueAt(rowIndex,1); Boolean veggie = (Boolean)model.getValueAt(rowIndex,4);Boolean veggie = (Boolean)model.getValueAt(rowIndex,4);

(продължава)(продължава)

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

Добавяне на подсказкиДобавяне на подсказки if (Boolean.TRUE.equals(veggie)) {if (Boolean.TRUE.equals(veggie)) {

tip = firstName + " " + lastNametip = firstName + " " + lastName + " is a vegetarian";+ " is a vegetarian"; } else {} else { tip = firstName + " " + lastNametip = firstName + " " + lastName + " is not a vegetarian";+ " is not a vegetarian"; }} } else { //други} else { //други tip = super.getToolTipText(e);tip = super.getToolTipText(e); }} return tip;return tip; }} ......}}

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

Добавяне на подсказкиДобавяне на подсказки

Примерен изход:Примерен изход:

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

Връзка на таблица от базата Връзка на таблица от базата данни с табличен интерфейсданни с табличен интерфейс

Пример за използване на табличен Пример за използване на табличен интерфейс – извеждане на данните за интерфейс – извеждане на данните за полетата и съдържанието им в таблицаполетата и съдържанието им в таблица

QueryTableModel.javaQueryTableModel.javaTableModel интерфейс образуващ вектор TableModel интерфейс образуващ вектор

от низове String[] от резултантно от низове String[] от резултантно множество, създадено от команда за множество, създадено от команда за селектиране на данни от базаселектиране на данни от база

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

Демонстрационен код....Демонстрационен код....import java.sql.*;import java.sql.*;import java.util.Vector;import java.util.Vector;import javax.swing.table.*;import javax.swing.table.*;public class QueryTableModel extends AbstractTableModel {public class QueryTableModel extends AbstractTableModel { Vector cache; // съдържа референции към String[]. . .Vector cache; // съдържа референции към String[]. . . int colCount;int colCount; String[] headers; // информация за имената на полетата на таблицатаString[] headers; // информация за имената на полетата на таблицата Connection db; Connection db; Statement statement; // стринг за съхраняване на команда Statement statement; // стринг за съхраняване на команда String currentURL; // стринг за свързване – адрес на източникаString currentURL; // стринг за свързване – адрес на източника public QueryTableModel() {// конструктор на модела – образува вектора в който се public QueryTableModel() {// конструктор на модела – образува вектора в който се

съхраняват данните (низове)съхраняват данните (низове) cache = new Vector();cache = new Vector(); }} public String getColumnName(int i) { return headers[i]; } // получаване на името на колоната public String getColumnName(int i) { return headers[i]; } // получаване на името на колоната

с указан индекс с указан индекс ii public int getColumnCount() { return colCount; } // получаване на броя колони на таблицатаpublic int getColumnCount() { return colCount; } // получаване на броя колони на таблицата public int getRowCount() { return cache.size();} // получаване на броя редове на таблицатаpublic int getRowCount() { return cache.size();} // получаване на броя редове на таблицата public Object getValueAt(int row, int col) {// получаване на стойността на клетка по public Object getValueAt(int row, int col) {// получаване на стойността на клетка по

ред/колонаред/колона return ((String[])cache.elementAt(row))[col];return ((String[])cache.elementAt(row))[col]; }} public void setHostURL(String url) {// установяване на адреса на данновия източникpublic void setHostURL(String url) {// установяване на адреса на данновия източник if (url.equals(currentURL)) {// базата е отворена и се използва същия стринг за свързванеif (url.equals(currentURL)) {// базата е отворена и се използва същия стринг за свързване return;return; }} closeDB(); // затваряне на базатаcloseDB(); // затваряне на базата initDB(url); // нова ициализацияinitDB(url); // нова ициализация currentURL = url; // запис на адресаcurrentURL = url; // запис на адреса }}

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

Демонстрационен код....Демонстрационен код....// установява стринга на заявката// установява стринга на заявката public void setQuery(String q) {public void setQuery(String q) { cache = new Vector();cache = new Vector(); try {try { // изпълнение// изпълнение ResultSet rs = statement.executeQuery(q);ResultSet rs = statement.executeQuery(q); ResultSetMetaData meta = rs.getMetaData(); // данни за полетата на таблицатаResultSetMetaData meta = rs.getMetaData(); // данни за полетата на таблицата colCount = meta.getColumnCount(); // брой полетаcolCount = meta.getColumnCount(); // брой полета // колони// колони headers = new String[colCount]; // образуване на стрингове за всяка колонаheaders = new String[colCount]; // образуване на стрингове за всяка колона for (int h=1; h <= colCount; h++) {for (int h=1; h <= colCount; h++) { headers[h-1] = meta.getColumnName(h); // запълване на имената от мета даннитеheaders[h-1] = meta.getColumnName(h); // запълване на имената от мета данните }} while (rs.next()) {while (rs.next()) { String[] record = new String[colCount];String[] record = new String[colCount]; for (int i=0; i < colCount; i++) {for (int i=0; i < colCount; i++) { record[i] = rs.getString(i + 1); // запълване на данните за всеки запис record[i] = rs.getString(i + 1); // запълване на данните за всеки запис }} cache.addElement(record); добавяне във вектораcache.addElement(record); добавяне във вектора }} fireTableChanged(null); // препращане на събитието.fireTableChanged(null); // препращане на събитието. }} catch(Exception e) {catch(Exception e) { cache = new Vector(); // нулиране на вектора.cache = new Vector(); // нулиране на вектора. e.printStackTrace();e.printStackTrace(); }} }}

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

Демонстрационен код....Демонстрационен код....public void initDB(String url) { // url = "jdbc:odbc:Example"public void initDB(String url) { // url = "jdbc:odbc:Example" try {try {// Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); // Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); db = DriverManager.getConnection(url,"",""); db = DriverManager.getConnection(url,"",""); // Class.forName ("sun.jdbc.mysql"); // Class.forName ("sun.jdbc.mysql"); // db = DriverManager.getConnection("jdbc:mysql","root","root"); // db = DriverManager.getConnection("jdbc:mysql","root","root"); db.setAutoCommit(false);db.setAutoCommit(false); statement = db.createStatement();statement = db.createStatement(); }} catch(Exception e) {catch(Exception e) { System.out.println("Could not initialize the database.");System.out.println("Could not initialize the database."); e.printStackTrace();e.printStackTrace(); }} }} public void closeDB() {public void closeDB() { try {try { if (statement != null) { statement.close(); }if (statement != null) { statement.close(); } if (db != null) { if (db != null) { db.close(); db.close(); }} }} catch(Exception e) {catch(Exception e) { System.out.println("Could not close the current connection.");System.out.println("Could not close the current connection."); e.printStackTrace();e.printStackTrace(); }} }}}}

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

Демонстрационен код....Демонстрационен код....import java.awt.*;import java.awt.*;import java.awt.event.*;import java.awt.event.*;import javax.swing.*;import javax.swing.*;//import javax.swing.table.*;//import javax.swing.table.*;//jdbc:odbc:Example //jdbc:odbc:Example //SELECT * FROM <име на таблицата>//SELECT * FROM <име на таблицата>// на основата на базовия прозорец JFrame се създава клас наследник DatabaseTest// на основата на базовия прозорец JFrame се създава клас наследник DatabaseTestpublic class DatabaseTest extends JFrame {public class DatabaseTest extends JFrame { JTextField hostField; // текстово поле за въвеждане на адреса, например JTextField hostField; // текстово поле за въвеждане на адреса, например

jdbc:odbc:Example jdbc:odbc:Example JTextField queryField; // текстово поле за въвеждане на заявката за селектиранеJTextField queryField; // текстово поле за въвеждане на заявката за селектиране QueryTableModel qtm; // обект от модела на заявкатаQueryTableModel qtm; // обект от модела на заявката public DatabaseTest() { public DatabaseTest() { super("Database Test Frame");super("Database Test Frame"); setDefaultCloseOperation(EXIT_ON_CLOSE);setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(350, 200);setSize(350, 200);// създаване на модел от разработения клас// създаване на модел от разработения клас qtm = new QueryTableModel();qtm = new QueryTableModel(); JTable table = new JTable(qtm);JTable table = new JTable(qtm); JScrollPane scrollpane = new JScrollPane(table);JScrollPane scrollpane = new JScrollPane(table); JPanel p1 = new JPanel();JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(3, 2));p1.setLayout(new GridLayout(3, 2)); p1.add(new JLabel("Enter the Host URL: "));p1.add(new JLabel("Enter the Host URL: ")); p1.add(hostField = new JTextField());p1.add(hostField = new JTextField()); p1.add(new JLabel("Enter your query: "));p1.add(new JLabel("Enter your query: ")); p1.add(queryField = new JTextField());p1.add(queryField = new JTextField()); p1.add(new JLabel("Click here to send: "));p1.add(new JLabel("Click here to send: "));

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

Демонстрационен код....Демонстрационен код....JButton jb = new JButton("Search"); // активиращ бутонJButton jb = new JButton("Search"); // активиращ бутон jb.addActionListener(new ActionListener() { // добавяне на слушател на jb.addActionListener(new ActionListener() { // добавяне на слушател на

събитията, събитията, // асоцииран към бутона. Обработва натискането като прочита // асоцииран към бутона. Обработва натискането като прочита

текстовете от контролите и гитекстовете от контролите и ги// подава на модела за изпълнение.// подава на модела за изпълнение. public void actionPerformed(ActionEvent e) {public void actionPerformed(ActionEvent e) { qtm.setHostURL(hostField.getText().trim());qtm.setHostURL(hostField.getText().trim()); qtm.setQuery(queryField.getText().trim());qtm.setQuery(queryField.getText().trim()); }} });}); p1.add(jb); // добавяне на бутона към панелаp1.add(jb); // добавяне на бутона към панела getContentPane().add(p1, BorderLayout.NORTH); //форматиране на getContentPane().add(p1, BorderLayout.NORTH); //форматиране на getContentPane().add(scrollpane, BorderLayout.CENTER);getContentPane().add(scrollpane, BorderLayout.CENTER); }}

public static void main(String args[]) {public static void main(String args[]) { DatabaseTest tt = new DatabaseTest();DatabaseTest tt = new DatabaseTest(); tt.setVisible(true);tt.setVisible(true); }}}}