Рефераты. Использование платформы j2me для мобильных телефонов при организации видеонаблюдений

*/

protected String getUIID() {

return "_unselected";

}

/**

* Change style for selected menu item

*/

public void focusGained (Component cmp) {

cmp.setStyle(selectedStyle);

}

/**

* Change style for unselected menu item

*/

public void focusLost (Component cmp) {

cmp.setStyle(unselectedStyle);

}

}

Метод getUIID() переопределен для того, чтобы возвращать стиль невыделенного элемента. Метод focusGained() вызывается при получении данным пунктом меню фокуса, и поэтому требуется этот пункт отрисовать другим стилем.

При перемещении фокуса на следующий пункт меню нужно поменять стиль этого пункта на обычный, что и выполняется в переопределенном методе focusLost().

Само меню создается следующим образом с использованием вышеуказанного класса (листинг 3.5). Preferences.getInstanse() - это объект, который хранит все сделанные пользователем настройки.

Листинг 3.5 - Создание главного меню

Preferences pr = Preferences.getInstanse();

setLayout (new BoxLayout (BoxLayout.Y_AXIS));

getContentPane().setIsScrollVisible(false);

MylistItem mli = new MylistItem (MainMenuConstatns.SCHEDULE, "Schedule");

if (! pr.isStartRecordFromUnbounded()) {

mli.addString ("from" +

pr.getStartRecordFromCalendar().get (java.util. Calendar.YEAR) +"." +

pr.getStartRecordFromCalendar().get (java.util. Calendar.MONTH) +"." +

pr.getStartRecordFromCalendar().get (java.util. Calendar.DAY_OF_MONTH)

+" "+pr.getStartRecordFromCalendar().get (java.util. Calendar.HOUR_OF_DAY)

+":"+pr.getStartRecordFromCalendar().get (java.util. Calendar.MINUTE));

}

if (! pr.isEndRecordAtUnbounded()) {

mli.addString ("till" +

pr.getEndsRecordAtCalendar().get (java.util. Calendar.YEAR) +"." +

pr.getEndsRecordAtCalendar().get (java.util. Calendar.MONTH) +"." +

pr.getEndsRecordAtCalendar().get (java.util. Calendar.DAY_OF_MONTH) + " " +

pr.getEndsRecordAtCalendar().get (java.util. Calendar.HOUR_OF_DAY) +":" +

pr.getEndsRecordAtCalendar().get (java.util. Calendar.MINUTE));

}

if (! pr.isStartRecordFromUnbounded() ||! pr.isEndRecordAtUnbounded()) {

if (pr.isScheduleIsActive()) {

mli.addString ("Active");

} else {

mli.addString ("Disabled");

}

}

addComponent(mli);

mli = new MylistItem (MainMenuConstatns.TRANSLATE_VIDEO, "Translate video");

addComponent(mli);

if (pr.getBTConnectionURL()!= "") {

mli.addString ("via bluetooth to "+pr.getBTFriendlyName());

}

if (pr.getSaveVideoToFile()!= "") {

mli.addString (pr.getSaveVideoToFile());

}

if (pr.getMovNotification()!= "") {

String msgType = (pr.isSendSMS()? "sms": "mms") +" to";

addComponent (new MylistItem (MainMenuConstatns.MOVEMENT_NOTIFICATION,

new String[] {"Movement notification", msgType

+ pr.getMovNotification()}));

} else {

addComponent (new MylistItem (MainMenuConstatns.MOVEMENT_NOTIFICATION,

"Movement notification"));

}

if (pr.getErrNotificationNumber()!= "") {

addComponent (new MylistItem (MainMenuConstatns.ERROR_NOTIFICATION,

new String[] {"Error Notification", pr.getErrNotificationNumber()}));

} else {

addComponent (new MylistItem (MainMenuConstatns.ERROR_NOTIFICATION,

"Error Notification"));

}

addComponent (new MylistItem (MainMenuConstatns.CAMERA, "Camera"));

addComponent (new MylistItem (MainMenuConstatns.EXIT, "Exit"));

addComponent (new MylistItem (MainMenuConstatns.HELP, "Help"));

Обработка нажатия пользователем кнопок и определение, какая экранная форма должна быть показана далее, выполняется так, как показано в следующем листинге 3.6.

Листинг 3.6 - Обработка нажатий кнопок для главного меню

class MainMenuActionListener implements ActionListener {

public void actionPerformed (ActionEvent act) {

Component cmp = getFocused();

if (cmp instanceof MylistItem) {

int id = ((MylistItem) cmp).getId();

switch (id) {

case MainMenuConstatns.SCHEDULE:

midlet.getScheduleDisplay().show();

break;

case MainMenuConstatns.TRANSLATE_VIDEO:

midlet.getVideoTransmitionDisplay().show();

break;

case MainMenuConstatns.MOVEMENT_NOTIFICATION:

midlet.getMovementNotificationDisplay().show();

break;

case MainMenuConstatns.CAMERA:

midlet.getCamera().show();

midlet.getCamera().startCamera();

midlet.getCamera().revalidate();

break;

case MainMenuConstatns.EXIT:

midlet.exitMIDlet();

break;

case MainMenuConstatns.HELP:

midlet.getHelpScreen().show();

break;

case MainMenuConstatns.ERROR_NOTIFICATION:

midlet.getErrorNotification().show();

break;

}

}

}

На форме настройки расписания (рисунок 3.3) необходимо было реализовать динамическое скрытие / отображение некоторых элементов, а именно: когда выбирается радиокнопка enter time, то должны сразу под ней отобразиться поля для ввода часов, минут, дня, месяца, года. А при выборе радиокнопки unbounded эти поля должны быть скрыты.

62

Рисунок 3.3 - Заполнение расписания работы камеры

Такая функциональность реализуется путем указания у каждой радиокнопки ActionListener, который отслеживает выбор радиокнопок (листинг 3.7). dateFrom и dateTo являются контейнерами типа Container и содержат все необходимые поля для указания точной даты и времени.

Листинг 3.7 - Обработка выбора радиокнопок

public void actionPerformed (ActionEvent evt) {

Component cmp = (Component) evt.getSource();

if (cmp == rb1DateFromEnter) {

if (rb1DateFromEnter.isSelected()) {

if (! getContentPane().contains(dateFrom)) {

addComponent (3, dateFrom);

revalidate();

return;

}

}

}

if (cmp == rbDateFromUnbounded) {

if (getContentPane().contains(dateFrom)) {

removeComponent(dateFrom);

revalidate();

return;

}

}

if (cmp == rbDateToEnter) {

if (rbDateToEnter.isSelected()) {

if (! getContentPane().contains(dateTo)) {

addComponent (getContentPane().getComponentCount() - 2, dateTo);

dateTo.setFocus(true);

revalidate();

return;

}

}

}

if (cmp == rbDateToUnbounded) {

if (getContentPane().contains(dateTo)) {

removeComponent(dateTo);

revalidate();

return;

}

}

}

Рисунок 3.4 - Экранная форма со списком

Для всех списков в данном приложении разработан специальный способ их отображения - класс MyListCellRenderer. По умолчанию для отображения списков применяется DefaultListCellRenderer, который просто преобразовывает все элементы к объектам класса Label. Для создания своего способа отображения элементов списка необходимо реализовать интерфейс ListCellRenderer.

Метод getListCellRendererComponent этого интерфейса должен возвращать отображаемый элемент списка из объекта, передаваемого ему в качестве параметра. Переопределение методов getListFocusComponent обеспечивает возможность настройки стилей отображения выделенного и невыделенного элемента списка.

Пример списка, реализованного с помощью MyListCellRenderer, приведен на рисунке 3.4. В листинге 3.8 приведен программный код класса, который прорисовывает список.

Листинг 3.8 - Прорисовка списка

public class MyListCellRenderer extends Container implements ListCellRenderer {

public MyListCellRenderer() {

setLayout (new BoxLayout (BoxLayout.Y_AXIS));

}

/**

* Returns displayable list element from received object

*/

public Component getListCellRendererComponent (List list, Object value,

int index, boolean isSelected) {

if (value instanceof String) {

setText((String) value);

} else {

setText (value.toString());

}

setFocus(isSelected);

applyStyle (this, isSelected);

return this;

}

/**

* Applies style for selected and unselected element

*/

private void applyStyle (Component component, boolean isSelected) {

Style style = null;

if (isSelected) {

style = UIManager.getInstance().getComponentStyle ("_selected");

} else {

style = UIManager.getInstance().getComponentStyle ("_unselected");

Страницы: 1, 2, 3, 4, 5, 6, 7



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.