Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Базовые типы

Замещающие типы
Без указателей
Массивы
Структурное программи-
рование

Обработка исключений
Возбуждение исключений
Классы обработки исключений
Блок finally
Строки String
Класс Math
Класс Vector
Класс Stack
Словарь на базе Hashtable
Словарь на базе Properties
Цифровые часы
Собственный класс
Наследование классов

Интерфейсы

Назад Вперед

1.16. Цифровые часы в документе HTML

На примере цифровых часов, встроенных в документ HTML как аплет, мы демонстрируем использование различных методов класса Date. Этот класс позволяет узнавать и устанавливать календарную дату и время.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java)

Немного теории

С помощью методов класса Date автономное приложение Java или аплет может определить или установить текущую дату и время. При этом некоторые методы возвращают дату в виде текстовой строки в стандарте координированного универсального времени UTC (Coordinated Universal Time), некоторые в локальном стандарте, а некоторые пригодятся для извлечения отдельных компонент даты.

Например, с помощью таких методов как getYear, get Date и getDay приложение обычно определяет номера года, месяца и дня недели. Методы getHours, getMinutes и getSeconds позволяют узнать, соответственно, количество часов, прошедших с момента начала суток, количество минут от начала текущего часа и количество секунд от начала текущей минуты.

В классе Date есть также методы для установки текущей даты и времени, а также для определения смещения локального часового пояса.

Описание примера

Аплет JavaClock отображает текущее время одновременно в нескольких форматах, получая информацию о дате и времени различными способами (рис. 1).

pic01.gif (2469 bytes)

Рис. 1. Отображение даты и времени в окне аплета JavaClock

Этот аплет создан как многопоточное приложение. Главный поток, выполняющий рисование в окне аплета, запускает поток ClockUpdate. Единственная задача этого потока - периодическая перерисовка окна аплета, выполняемая каждую секунду. С таким периодом вызывается метод paint класса JavaClock, отображающий время.

Класс JavaClock

Перейдем к описанию исходного текста примера. При этом мы сконцентрируем внимание в основном на методе paint, в теле которого выполняется обращение к методам класса Date.

Внутри тела этого метода мы создали переменные yStart и yCurrent типа int, а также рабочую строку szDate:

int yStart = 20;
int yCurrent = yStart;
String szDate;

В переменной yStart хранится координата по оси Y верхней границы области окна аплета, использованной для отображения времени. В процессе вывода отдельные строки отображаются со смещением yCurrent.

Каждый раз при выводе новой строки это смещение увеличивается на высоту символов текущего шрифта, выбранного в контекст отображения. Чтобы определить эту высоту, мы создаем объект fm класса FontMetrics:

FontMetrics fm = g.getFontMetrics();

При этом метод getHeight, определенный в классе FontMetrics, возвратит нам искомую высоту символов.

Для определения текущей даты и времени метод paint создает объект dt класса Date:

Date dt = new Date();

Затем метод paint выводит красным цветом название метода, с помощью которого получена информация о дате. Например:

g.setColor(Color.red);
g.drawString("toString()", 10, yCurrent);
yCurrent += fm.getHeight();
g.setColor(Color.black);

Здесь выводится надпись для метода toString.

Вызывается этот метод следующим образом:

szDate = dt.toString();

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

g.drawString(szDate, 10, yCurrent);
yCurrent += fm.getHeight();
yCurrent += fm.getHeight();

При этом формат строки совпадает с тем, что используется функцией ctime стандартной библиотеки языка Си.

Если вам нужно получить строку времени в локальном формате, зависящем от локальных национальных настроек операционной системы, воспользуйтесь методом toLocaleString. Наша программа вызывает его так:

szDate = dt.toLocaleString();

Смещение локального часового пояса нетрудно определить методом getTimezoneOffset:

int off = dt.getTimezoneOffset();
szDate = "Time offset, minutes: " + off;

Этот метод возвращает значение смещения в минутах.

Последнее, что делает метод paint, это отображает строки даты и времени, составленные из отдельных компонент. Компоненты даты и времени определяются при помощи таких методов, как getYear и getHours:

szDate = "Year: " + dt.getYear() +
  ", Month: " + dt.getMonth() +
  ", Date: " + dt.getDate() +
  ", Day: " + dt.getDay();
g.drawString(szDate, 10, yCurrent);
yCurrent += fm.getHeight();
    
szDate = "Hours: " + dt.getHours() +
  ", Minutes: " + dt.getMinutes() +
  ", Seconds: " + dt.getSeconds();
g.drawString(szDate, 10, yCurrent);

Обращаем ваше внимание на то, что метод getMonth возвращает значения в диапазоне от 0 до 11. При этом 0 соответствует январю, а 11 - декабрю.

Метод getDay возвращает номер дня недели в диапазоне от 0 до 6. Нумерация дней недели начинается с воскресенья (0), затем идет понедельник (1), вторник (2) и так далее до субботы (6).

Теперь кратко о других методах, определенных в классе JavaClock.

Метод start получает управление при активизации аплета и запускает поток ClockUpdate, обновляющий показания часов:

public void start()
{
  if (m_ClockUpdate == null)
  {
    m_ClockUpdate = new ClockUpdate(this);
    m_ClockUpdate.start();
  }
}

Конструктору класса ClockUpdate мы передаем ссылку на аплет. Данная ссылка будет использована для перерисовки окна аплета методом repaint.

Метод stop останавливает поток ClockUpdate, когда документ HTML с нашими электронными часами исчезает из окна браузера:

public void stop()
{
  if (m_ClockUpdate != null)
  {
    m_ClockUpdate.stop();
    m_ClockUpdate = null;
  }
}

Класс ClockUpdate

Исходный текст этого класса, созданного на базе Thread, очень прост. В нем мы определили конструктор и метод run.

Конструктор сохраняет ссылку на аплет, переданную ему в качестве параметра, в поле App, определенном в классе ClockUpdate:

public ClockUpdate(Applet Appl)
{
  App = Appl;
}

Что же касается метода run, то он работает в отдельном потоке.

Тело метода представляет собой бесконечный цикл, в котором для аплета App вызывается метод repaint:

public void run()
{
  while (true)
  {
    App.repaint();
      
    try
    {
      Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
      stop();
    }
  }
}

Этот метод перерисовывает окно аплета.

После вызова метода repaint в цикле выполняется задержка на одну секунду, для чего вызывается метод sleep из класса Thread.

Назад Вперед

[Назад]