corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Создание графического клиента для Twitter

В данном учебном курсе рассматривается использование среды IDE NetBeans для создания простого графического клиента на основе REST, отображающего сообщения друзей на ленте и позволяющего просматривать и обновлять статус в Twitter. Данное приложение использует Swing и поддержку среды IDE NetBeans для операций SaaS для Twitter.

Запуск клиента с отображением сообщений Twitter

При отсутствии учетной записи Twitter перейдите по ссылке twitter.com и создайте ее.

Полный образец данного приложения доступен для загрузки. Щелкните здесь для загрузки образца.

Содержание

Содержимое на этой странице относится к среде IDE NetBeans 6.9-7.0

Для работы с этим учебным курсом требуются программное обеспечение и ресурсы, перечисленные ниже.

Программное обеспечение или ресурс Требуемая версия
Среда IDE NetBeans Пакет загрузки Java EE
Комплект для разработчика на языке Java (JDK) Версия 6
Имя пользователя и пароль для учетной записи Twitter

Проектирование JFrame

В этом действии будут созданы элементы графического пользовательского интерфейса, позволяющие отобразить ленту сообщений и пользовательский значок, а также читать и обновлять статус в Twitter. Все элементы графического пользовательского интерфейса переносятся в JFrame. Точное соблюдение принципов создания элементов графического пользовательского интерфейса, описанных в данном разделе, не требуется. Представленный вариант создания носит рекомендательный характер. Например, можно добавить больше функциональных возможностей. Тем не менее, создание всех элементов, описанных в данном учебном курсе, обязательно.

Проектирование JFrame:

  1. Выберите "File" > "New Project". Откроется мастер создания проекта. Выберите категорию "Java category", затем выберите проект приложения "Java Application project". Нажмите кнопку "Next".
  2. Присвойте проекту имя TwitterSwingClient. Выберите путь к папке проекта в поле "Project Location". Снимите флажок "Create Main Class". (JFrame станет главным классом). Нажмите кнопку "Finish".
    Мастер создания проектов с полями для создания проекта TwitterSwingClient
  3. В среде IDE будет создан проект TwitterSwingClient, отображаемый в окне "Projects". Щелкните правой кнопкой мыши узел проекта "TwitterSwingClient" и выберите "New" > "JFrame Form" (или "New" > "Other" > "Swing GUI Forms" > "JFrame Form"). Откроется мастер создания форм JFrame.
  4. Присвойте форме имя TwitterJFrame и создайте для нее пакет с именем twitterclient. Нажмите кнопку "Finish".
    Мастер создания форм JFrame с полями для создания TwitterJFrame
  5. TwitterJFrame будет открыт в представлении "Design" редактора среды IDE. В нем содержится палитра Swing с компонентами, которые можно перетащить в JFrame.
    Twitter JFrame в режиме редактирования в редакторе
  6. Щелкните элемент управления "Button", расположенный под элементами управления Swing в палитре. Перетащите его в правый нижний угол JFrame. Обратите внимание, что кнопка отображает имя объекта JButton - "jButton1".
    JFrame, отображающий добавленный объект jButton1
  7. Щелкните правой кнопкой мыши "jButton1" и выберите в контекстом меню команду "Edit Text". Измените отображаемый текст на "Update".
  8. Перетащите элемент управления "Label" (jLabel1) в левый нижний угол JFrame. Измените отображаемый текст на "Icon". В этой метке будет отображаться значок пользователя.
  9. Перетащите элемент управления "Text Field" (jTextField1) в позицию между элементами "Label" и "Button". Измените отображаемый текст на "Status". Щелкните правый край текстового поля и растяните его в направлении кнопки. При этом должны появиться голубые направляющие, отображающие предполагаемое расстояние от кнопки.
  10. Щелкните правой кнопкой мыши "jLabel1" и выберите "Properties" в контекстном меню. Откроется диалоговое окно "jLabel1 Properties". Установите свойство labelFor для указания на "jTextField1". (Это повысит уровень доступности).
  11. Найдите свойства "Maximum Size", "Minimum Size" и "Preferred Size". Установите для каждого из свойств значение [48,48] для соответствия размерам значков Twitter: 48 X 48 пикселей.
    Значения свойств элемента "jLabel 1" в Twitter JFrame, отображающие "Maximum Size", "Minimum Size" и "Preferred Size", установленные на 48, 48
  12. Перетащите контейнер "Scroll Pane" в верхнюю часть JFrame. Растяните его границы так, чтобы он занимал большую часть или все пространство над текстовым полем и кнопкой. (Можно оставить некоторое пространство пустым для добавления дополнительных функций, например, меню в образце приложения.)
  13. Перетащите элемент "List" в "Scroll Pane". Появится список элементов. Сохраните TwitterJFrame. JFrame должен выглядеть, как изображено на рисунке ниже:
    TwitterJFrame в режиме конструктора со всеми базовыми элементами графического пользовательского интерфейса

Все компоненты графического пользовательского интерфейса для клиента Swing созданы. Теперь можно добавить первую операцию Twitter SaaS.

Отображение пользовательского статуса

В данном разделе будет создан новый метод и к нему добавлена операция Twitter getUserTimeline. Операции getUserTimeline присваивается значок и текущий статус пользователя. Теперь необходимо добавить код к методу для отображения значка и статуса в "jLabel1" и "jTextField" соответственно. Также необходимо добавить строку в конструктор JFrame для инициализации метода.

Отображение пользовательского статуса:

  1. Перейдите в режим просмотра исходного кода TwitterJFrame.
  2. Нажмите ALT+INS или нажмите правую кнопку мыши и выберите команду "Вставить код". Откроется меню вставляемого кода.
    Меню вставляемого кода в методе initUserInfo
  3. Щелкните элемент "Создать клиент REST". Откроется диалоговое окно "Доступные ресурсы REST".
    Диалоговое окно "Доступные ресурсы REST"
  4. Выберите параметр "Зарегистрированные в среде IDE" и нажмите кнопку "Обзор". Перейдите к разделу Twitter > Twitter OAuth > [statuses] > [user_timeline.{format}]. Нажмите кнопку "ОК".
    Окно "Services" с деревом "Web Services", отображающее выбор операции Twitter getUserTimelineById
  5. Отобразится диалоговое окно "Доступные ресурсы REST" с выбранным ресурсом Twitter OAuth user_timeline, соответствующим именем класса и типом проверки подлинности OAuth. Нажмите кнопку "ОК".
    Диалоговое окно "Доступные ресурсы REST" с данными
  6. Откроется диалоговое окно с запросом о необходимости создания объектов Java на основе ссылок на схемы XML в файле WADL. Нажмите кнопку "Да".
  7. В конце класса TwitterJFrame среда IDE создает внутренний класс с именем Twitter_OAuth_user_timeline__format_JerseyClient.

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

    • CONSUMER_KEY: строка Consumer Key
    • CONSUMER_SECRET: строка Consumer Sectret
    • initOAuth(): метод для инициализации OAuth
    • getUserTimeline(): метод, соответствующий методу HTTP getUserTimeline (из ресурса REST)
    • makeOAuthRequestUnique(): используется для нескольких вызовов API в одном сеансе
    • login: используется для входа в приложение Twitter (принудительная авторизация). Этот метод вызывает два дополнительных метода: getOAuthAccessToken и getOAuthRequestToken.

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

    Окно навигатора с классом Twitter_OAuth_user_timeline__format_JerseyClient
  8. В элементе TwitterJFrame вставьте следующий код непосредственно перед внутренним классом Twitter_OAuth_user_timeline__format_JerseyClient. Этот код создает переменную client, представляющую собой экземпляр внутреннего класса.
    private Twitter_OAuth_user_timeline__format_JerseyClient client;
    Фрагмент кода с переменной client непосредственно перед внутренним классом
  9. Найдите метод main в TwitterJFrame. Перед этим методом создайте новый метод initUserInfo, вызывающий исключения MalformedURLException и IOException.
    private void initUserInfo() throws MalformedURLException, IOException {
    
    
    
    }
  10. Вставьте следующий код в тело метода initUserInfo. Комментарии в коде описывают выполняемые действия.
    private void initUserInfo() throws MalformedURLException, IOException {
    
    //Создание экземпляра внутреннего класса службы client = new Twitter_OAuth_user_timeline__format_JerseyClient("xml");
    //Вход в систему, получение маркеров и их присоединение к ключам consumer и secret client.login(); client.initOAuth();
    //Вызов getUserTimeline, получение списка статусов, передача последнего //статуса в виде объекта StatusType и отображение текста этого объекта в //поле JTextField Statuses statuses = client.getUserTimeline(Statuses.class, null, null, null, "1"); StatusType st = statuses.getStatus().get(0); jTextField1.setText(st.getText().trim());
    //Получение объекта UserType из объекта StatusType, получение URL-адреса этого //значка пользователя и отображение этого значка в JLabel UserType user = st.getUser(); String iconSrc = user.getProfileImageUrl(); URL iconUrl = new URL(iconSrc); ImageIcon icon = new ImageIcon(iconUrl, user.getScreenName()); jLabel1.setIcon(icon); }
  11. Откройте диалоговое окно "Исправление операторов импорта" (CTRL+SHIFT+I или из контекстного меню). В диалоговом окне выберите twitter.twitteroauth.twitterresponse.StatusType, а не класс Java по умолчанию StatusType.
    Диалоговое окно "Исправление операторов импорта" после завершения метода initUserInfo
  12. Добавьте блок try/catch в конструктор TwitterJForm для вызова initUserInfo при выполнении приложения. Диалоговое окно "Исправление операторов импорта" после добавления блока try/catch.
    public TwitterJFrame() {
        initComponents();
    
        try {
            initUserInfo();
        } catch (IOException ex) {
            Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
     }

После получения ключей OAuth с сайта Twitter можно запустить проект. Щелкните правой кнопкой мыши узел "project" и выберите "Run" в контекстном меню. Откроется приложение, отображающее значок и статус пользователя.

Получение ключей OAuth с сайта Twitter

Чтобы обеспечить доступ приложения Java к данным Twitter, необходимо получить с сайта Twitter ключи CUSTOMER и CUSTOMER_SECRET, а также строку подтверждения. Эти ключи необходимы, так как на сайте Twitter используется авторизация OAuth. При этом метод OAuth предполагает вызов со стороны веб-приложения на сервере. Чтобы получить ключи авторизации, необходимо зарегистрировать фиктивное веб-приложение.

Получение ключей OAuth с сайта Twitter:

  1. Откройте обозреватель. Выберите команды "Twitter" > "Приложения" и нажмите кнопку "Зарегистрировать новое приложение". Предварительно следует войти в учетную запись Twitter. Если у вас есть несколько учетных записей, убедитесь в том, что выполнен вход в верную запись.
  2. Введите NB User Timeline Application в текстовое поле Application Name.
  3. Введите описание в поле Description. Это необходимый параметр. Например, можно ввести следующее описание: "Java application created in NetBeans IDE calling the user_timeline operation".
  4. Введите произвольный URL-адрес в поле Application Website.
  5. Выберите значение Client для параметра Application Type.
  6. Выберите значение Read & Write для параметра Default Access Type.

    Внимание! Убедитесь в том, что выбрано значение Read & Write. Несмотря на то, что параметры можно изменить позже, это не влияет на полномочия доступа приложения.

  7. Не изменяйте другие значения по умолчанию и нажмите кнопку Save. Откроется страница обозревателя с подробными сведениями о зарегистрированном приложении. Найдите параметры Consumer key и Consumer secret.
  8. Скопируйте параметр Consumer key из обозревателя. Перейдите в среду IDE и скопируйте строку, в которой устанавливается параметр CONSUMER_KEY. Вставьте значение ключа Consumer key между кавычками.
    Клиент TwitterClient с расположением CONSUMER_KEY и CONSUMER_SECRET
  9. Скопируйте и вставьте ключ Consumer secret key из обозревателя в клиент TwitterSwingClient. Сохраните изменения.

Выполнение проекта

После получения ключей Consumer key и Consumer secret key проект можно запустить. Приложение вызывает сайт Twitter, который открывает окно браузера для разрешения доступа к данным.

Для запуска проекта выполните следующие действия:

  1. Если TwitterSwingClient является основным проектом, нажмите клавишу F6. В противном случае щелкните узел проекта TwitterSwingClient правой кнопкой мыши и выберите команду "Выполнить" в контекстном меню.
  2. В обозревателе откроется окно Twitter с запросом на разрешение доступа к данным Twitter. Нажмите кнопку Allow.
  3. Загрузится новая страница с ПИН-кодом. Скопируйте этот ПИН-код.
  4. В окне вывода среды IDE отобразится запрос на ввод строки oauth_verifier. Вставьте ПИН-код после двоеточия : и нажмите кнопку ВВОД.
    Окно вывода среды IDE с запросом строки подтверждения (не введено)
  5. Откроется настольный клиент, отображающий последние сообщения Twitter.
    Работающее приложение со значком пользователя и статусом

Вызов нескольких служб

Итоговая версия приложения вызывает три службы Twitter: user_timeline{format} (уже вызвано), update{format}и friends_timeline{format}. Вызовы этих служб используют одно и то же имя пользователя. Для этого вызовы должны иметь один и тот же класс клиента. Вызов нескольких служб с одного клиента выполняется в два этапа:

  • Добавление нескольких служб в один клиентский класс.
  • Изменение пути ресурсов в клиентском классе.

Добавление служб и объединение вызовов в один класс

В этом разделе вначале добавляются клиенты для других служб, которые затем объединяются в один клиент.

Добавление нескольких служб:

  1. Нажмите клавиши ALT+INS и выберите команду "Создать клиент REST".
    Меню вставляемого кода в методе initUserInfo
  2. Выполните действия по созданию клиента REST, которые были описаны в разделе Отображение пользовательского статуса, но выберите службу [statuses] > [update.{format}]. В среде IDE будет создан внутренний класс Twitter_OAuth_update__format_JerseyClient, схожий с классом Twitter_OAuth_user_timeline__format_JerseyClient.
    Диалоговое окно "Доступные ресурсы REST" со службой update format
  3. Повторите действия 1 и 2, чтобы добавить клиент для службы [friends_timeline.{format}].
  4. Измените имя исходного класса Twitter_OAuth_user_timeline__format_JerseyClient. Он будет общим классом, вызывающим все три службы. Выберите экземпляр имени Twitter_OAuth_user_timeline__format_JerseyClient и нажмите CTRL+R или нажмите правую кнопку мыши и выберите команду "Реорганизация кода" > "Переименовать". Откроется диалоговое окно "Переименование класса". Введите новое имя TwitterClient.
    Диалоговое окно "Переименование класса" с новым именем TwitterClient
  5. Нажмите кнопку "Реорганизация кода". В среде IDE будут заменены все экземпляры имени класса.
    Изменение имени класса в различных расположениях
  6. Найдите класс Twitter_Oauth_friends_timeline__format_JerseyClient в окне навигатора. Найдите и дважды щелкните метод getFriendsTimeline в этом классе.
    Окно навигатора с методом getPublicTimeline
  7. Курсор в редакторе будет перемещен к методу getFriendsTimeline. Вырежьте приведенный ниже метод в буфер обмена.
    public <T> T getFriendsTimeline(Class<T> responseType, String since, String since_id, String page, String count) throws UniformInterfaceException {
          String[] queryParamNames = new String[]{"since", "since_id", "page", "count"};
          String[] queryParamValues = new String[]{since, since_id, page, count};
          return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);
    }
  8. Вставьте метод getFriendsTimeline во внутренний класс TwitterClient под методом getUserTimeline.
  9. Вырежьте и вставьте метод updateStatus из Twitter_OAuth_update__format_JerseyClient в TwitterClient под методом getFriendsTimeline.

Изменение путей ресурсов

Теперь все вызовы служб Twitter выполняются в одном клиентском классе. При этом пути ресурсов в этом классе создаются некорректно. Сгенерированные средой IDE пути относятся к службе user_timeline при первом создании класса. Необходимо изменить класс таким образом, чтобы на уровне класса путь ресурсов был общим, а конкретные пути назначались методами вызова служб.

Изменение путей ресурсов:

  1. Найдите конструктор TwitterClient и удалите параметр String format.
    До и после удаления параметра из конструктора
  2. В правом поле появляется красный указатель ошибки. Щелкните его, чтобы перейти к строке в элементе initUserInfo, которая создает экземпляр класса TwitterClient. Это строка client = new TwitterClient("xml");. Удалите параметр xml, так как конструктор TwitterClient больше не принимает его. Теперь строка выглядит следующим образом: client = new TwitterClient();. Указатели ошибки исчезают.
  3. Вернитесь к конструктору TwitterClient. Для этого можно использовать окно навигатора. Найдите следующую строку:
    String resourcePath = java.text.MessageFormat.format("statuses/user_timeline.{0}", new Object[]{format}); 

    Эта строка задает путь resourcePath для всего класса. Измените строку таким образом, чтобы путь resourcePath указывал на каталог statuses. Теперь строка выглядит следующим образом:

    String resourcePath = "statuses";
  4. Перейдите к методу getUserTimeline. Найдите строку return:
    return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues))...;

    Добавьте сведения о пути (выделены ниже жирным шрифтом) в начало вызова.

    return webResource.path("user_timeline.xml").queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);
  5. Перейдите к методу getFriendsTimeline. Найдите строку return:
    return webResource.queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);

    Добавьте сведения о пути в начало вызова.

    return webResource.path("friends_timeline.xml").queryParams(getQueryOrFormParams(queryParamNames, queryParamValues)).accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);
  6. Перейдите к методу updateStatus. Найдите строку return:
    return webResource.type(javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED)...

    Добавьте сведения о пути в начало вызова.

    return webResource.path("update.xml").type(javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED).post(responseType, getQueryOrFormParams(formParamNames, formParamValues));
  7. Найдите и закомментируйте метод TwitterClient setResourcePath. Это делается в качестве предосторожности, так как он нигде не вызывается.
  8. Удалите классы Twitter_OAuth_update__format_JerseyClient и Twitter_Oauth_friends_timeline__format_JerseyClient.

Теперь из класса JerseyClient доступны все три службы.

Внимание! В приведенной выше процедуре изменяется три оператора return. Убедитесь в том, что изменены все три оператора!

Добавление действия по обновлению статуса

  1. Вернитесь в представление "Design" в TwitterJFrame. Дважды щелкните кнопку "Update" в JFrame. Редактор возвращается к представлению "Source" в теле метода jButton1ActionPerformed, созданного средой IDE.
    TwitterJFrame в представлении "Source" с курсором в центре созданного метода jButton1ActionPerformed
  2. Заполните тело метода jButton1ActionPerformed следующим текстом:

    Внимание! При обновлении статуса он будет отображаться в кодировке UTF-8, пробелы будут отображаться в виде знаков + или символов %21 и т.д. Если содержимое текстового поля не преобразовать в UTF-8, то приложение завершит работу с ошибкой "Invalid signature" при наличии пробелов в сообщении! Если вы найдете обходное решение этой проблемы, используйте ссылку "Обратная связь" в руководстве.

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String rawStatus = jTextField1.getText().trim();
        String status = URLEncoder.encode(rawStatus, "UTF-8");
        client.makeOAuthRequestUnique();
        try {
        client.updateStatus(String.class, status, null);
        } catch(UniformInterfaceException ex) {
            System.out.println("Exception when calling updateStatus = " + ex.getResponse().getEntity(String.class));
        }
    
    }    

Этот код получает текст из текстового поля и передает его в класс updateStatus. Обратите внимание на вызов makeOAuthRequestUnique. Код вызывает этот метод, так как приложение уже выполнило вход в систему и авторизовано путем вызова login и initOAuth из initUserInfo в ходе инициализации. Метод makeOAuthRequestUnique увеличивает существующие параметры OAuth nonce и timestamp для обеспечения уникальности каждого из запросов.

Внимание! В этом случае неочевидно, какой из методов лучше использовать: makeOAuthRequestUnique или initOAuth. При неполадках взаимодействия следует попробовать обе формы.

Следует также отметить, что вызов updateStatus окружен блоком try/catch. Это позволяет устранить ошибки, которые могут возникать при вызове updateStatus.

Отображение имен пользователей и статусов в JFrame

Теперь настроим приложение для отображения имен пользователей и всех статусов друзей в Twitter.

Создание TimerTask

Для автоматического обновления ленты сообщений в Twitter перенесите код выполнения в TimerTask. Напишите обертку TimerTask и заполните ее при помощи кода выполнения. В противном случае в коде возникнет множество предупреждений об ошибках.

Создание TimerTask:

  1. Откройте TwitterJFrame в представлении "Sources" редактора.
  2. Найдите объявление класса и конструктор.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Создание новой формы TwitterJFrame */
        public TwitterJFrame() {
            initComponents();
            try {
                initUserInfo();
            } catch (IOException ex) {
                Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
  3. В теле метода конструктора, расположенного выше initComponents();, создайте экземпляр класса java.util.Timer. Посредством параметров поток Timer получит имя "Twitter Updater" и запрет на запуск в качестве демона.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Создание новой формы TwitterJFrame */
        public TwitterJFrame() {
            Timer t = new Timer("Twitter Updater`", false);
            initComponents();
            try {
                initUserInfo();
            } catch (IOException ex) {
                Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
                        
  4. Щелкните правой кнопкой мыши в любом месте редактора и выберите из контекстного меню команду "Fix Imports" или нажмите Ctrl+Shift+I. Откроется диалоговое окно и появится список импортируемых классов. Добавьте оператор импорта для java.util.Timer.
  5. После создания экземпляра класса Timer, создайте новый метод Timer.scheduleAtFixedRate. Параметрами метода являются объект TimerTask, задержка перед первым выполнением задачи и частота выполнения задачи. Установите для метода время ожидания равным 30 секундам и частоту запуска равной 75 секундам. Начальная задержка позволяет войти в систему. Точный код, выделенный полужирным шрифтом, изображен на рисунке ниже. На месте вставки кода выполнения остается пустая строка. Обратите внимание, что для java.util.TimerTask необходимо добавить оператор импорта.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Создает новую форму TwitterJFrame */
        public TwitterJFrame() {
            Timer t = new Timer("Twitter Updater`", false);
            t.scheduleAtFixedRate(new TimerTask() {

    }, 30000, 75000);
    initComponents(); try { initUserInfo(); } catch (IOException ex) { Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); } }

Теперь код обертки TimerTask является завершенным. Далее рассматривается добавление кода выполнения.

Добавление метода run с помощью операции getFriendsTimeline

Для отображения имен пользователей и статусов приложение вызывает данные из Twitter. Twitter SaaS предоставляет операцию getFriendsTimeline для получения имен пользователей и статусов. Для выполнения операции getFriendsTimeline при запуске приложения она должна находиться внутри метода run. Поскольку приложение отображает имена пользователей и статусы в JList, ему потребуется добавить результаты getFriendsTimeline как элементы объекта DefaultListModel.

Добавление метода run с помощью операции getFriendsTimeline:

  1. Над конструктором TwitterJFrame создайте объект DefaultListModel с именем statusesListModel.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        private DefaultListModel statusesListModel = new DefaultListModel();
    
    /** Создает новую форму TwitterJFrame */ public TwitterJFrame() {
  2. Щелкните правой кнопкой мыши в любом месте редактора и выберите из контекстного меню команду "Fix Imports" или нажмите Ctrl+Shift+I. В результате этого действия для DefaultListModel будет добавлен оператор импорта.
  3. В теле объекта TimerTask создайте новый метод run. Используйте аннотацию @Override для переопределения метода run в main.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        private DefaultListModel statuses = new DefaultListModel();

    /** Создает новую форму TwitterJFrame */ public TwitterJFrame() { Timer t = new Timer("Twitter Updater`", false);
    t.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run(){

    }

    }, 1500, 75000);
    initComponents(); try { initUserInfo(); } catch (IOException ex) { Logger.getLogger(TwitterJFrame.class.getName()).log(Level.SEVERE, null, ex); }
  4. Вставьте следующий код в тело метода run.
    @Override
    public void run() {
        System.out.println("Timer Task is running");
        try {
            client.initOAuth();
            Statuses response = client.getFriendsTimeline(Statuses.class, null, null, null, "10");
            // Очистка модели для предотвращения репликации содержимого последнего прогона
            statusesListModel.clear();
            // Создание объекта Status Type для каждого статуса списка Status и добавление элемента 
            // в модель списка для каждого из объектов
            for (final StatusType st : response.getStatus()) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        statusesListModel.addElement(st);
                    }
                });
            }
        } catch (UniformInterfaceException ex) {
        System.out.println("Exception when calling getFriendsTimeline = " + ex.getResponse().getEntity(String.class));
        }
    }

Код для получения статусов из ленты сообщений Twitter готов. Теперь необходимо написать новый класс, возвращающий объект Component с элементами списка, визуализируемыми в компонентах графического пользовательского интерфейса.

Создание компонента визуализации ячейки списка

Теперь у вас имеется код, получающий объекты Status из ленты сообщений друзей Twitter и создающий элемент списка для каждого статуса. Однако элементы строк списка не могут быть отображены в JList. Необходимо передать данные в компоненты графического пользовательского интерфейса. Для этого создайте новый JPanel, реализующий javax.swing.ListCellRenderer. JPanel вернет объект java.awt.Component, передав имя пользователя и статус в JLabels. Можно настроить внешний вид JLabels в JPanel.

Добавление компонента визуализации ячейки списка:

  1. Щелкните правой кнопкой мыши узел проекта и выберите "New" > "JPanel Form". Откроется мастер создания форм JFrame.
  2. Определите для JPanel имя Item и разместите его в пакете twitterclient.
    Мастер создания форм JPanel с панелью Item и пакетом twitterclient
  3. Нажмите кнопку "Finish". В представлении "Design" редактора откроется Item.java.
  4. Перетащите элементы "Label" и "Text Pane" в JPanel. "Label" отобразит имя пользователя, а "Text Pane" – сообщение о статуса пользователя.
  5. Разместите "Label" и "Text Pane" в соответствии с тем, как вы хотите отобразить данные. На рисунке ниже имя пользователя расположено наверху слева, а текст статуса – ниже, с небольшим отступом вправо. В проекте примера приложения данные расположены наверху слева, а имя пользователя – внизу справа. Оставьте достаточно пустого пространства в "JPanel" под "Text Pane" для расширения панели "Text Pane" в случае увеличения объема текста.
    Расположение "jlabels", отображающих имя пользователя и текст статуса
  6. Щелкните правой кнопкой мыши элемент "jLabel" и выберите "Properties" в контекстном меню. В окне "Properties" можно изменить шрифт, цвет, выравнивание и другие характеристики. Установите свойство "labelFor" для указания на "jTextPane1". Это повысит уровень доступности. Поэкспериментируйте со свойствами метки для достижения требуемого внешнего вида. На рисунке ниже цвет шрифта установлен на синий в свойстве "Foreground".
    Свойства диалогового окна "JLabel" со свойством "Foreground", установленным на синий цвет
  7. Откройте диалоговое окно "Properties" панели "JTextPane" и попробуйте изменить различные настройки ее внешнего вида.
  8. Перейдите в представление "Source" для Item.java. Найдите блок "Generated Code" и разверните его. В результате отобразится код, созданный средой IDE при установке свойств "JLabel" и "JTextPane".

    Обратите внимание на синий цвет, установленный для "JLabel1" на рисунке ниже. Обратите также внимание на свойства, установленные для "JTextPane".

    Код, созданный в Item.java при установке свойств "JLabel" в представлении "Design"
  9. Найдите объявление класса и добавьте код implements ListCellRenderer.
    public class Item extends javax.swing.JPanel implements ListCellRenderer {
  10. Нажмите Ctrl+Shift+I. В результате этого действия будет добавлен оператор импорта для javax.swing.ListCellRenderer. Появится предупреждение о необходимости реализации всех абстрактных методов.
  11. Добавьте несколько пустых строк между созданным блоком кода и объявлениями переменных. В это пространство добавьте следующий код, реализующий абстрактный метод getListCellRendererComponent. (Можно скопировать и вставить этот код или попробовать ввести его с помощью функции автозавершения кода). Этот код заменит тексты меток по умолчанию username и text объектами Text, User и ScreenName, полученными вместе с классом twitteroauth StatusType. После этого код вернет экземпляр класса "Component" с новыми значениями свойства "text" в "JLabel".
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) {
            StatusType st = (StatusType) value;
            jTextPane1.setText(st.getText());
            jLabel1.setText("<html>" + st.getUser().getScreenName() + "</html>");
            return this;
                        }
  12. Нажмите Ctrl+Shift+I. В результате для классов "StatusType" и "Component" будут добавлены операторы импорта. Выберите версию twitteroauth StatusType. Сохраните Item.java.

Теперь у вас есть класс "Item", возвращающий объект "Component" с отображаемыми в "JLabel" и "JTextPane" именем пользователя и статусом. Настроим "TwitterJFrame" для использования "Component".

Отображение объекта "Component" в TwitterJFrame

Для отображения объекта "Component", созданного в Item.java, JList в TwitterJFrame должен в качестве средства визуализации ячейки использовать Item.java.

  1. Вернитесь в TwitterJFrame. Выберите "JList" в представлении "Design". Щелкните правой кнопкой мыши и откройте "Properties".
    Диалоговое окно "Properties" для элемента "JList" в TwitterJFrame
  2. Выберите свойство model. Нажмите комбинацию клавиш Ctrl+Пробел. Откроется пользовательский редактор свойств, в котором текст будет отображен в списке по умолчанию.
    Пользовательский редактор свойств "Jlist"
  3. В раскрывающемся меню "Set jLlist1's model property using:" выберите "Custom Code". Появится текстовое поле, в которое необходимо ввести свойства для jLabel1.setModel. Введите в поле statusesListModel и нажмите кнопку "ОК".
    Пользовательский редактор свойств "jList", отображающий выбранное свойство "setModel(statuses)" в пользовательском редакторе кода
  4. В диалоговом окне "Properties" выберите "cellRenderer" и нажмите комбинацию клавиш Ctrl+Пробел. Откроется пользовательский редактор свойств.
  5. В раскрывающемся меню "Set jLlist1's cellRenderer property using:" выберите "Custom Code". Появится текстовое поле, в которое необходимо ввести свойства для jLabel1.cellRenderer. Введите new Item() и нажмите кнопку "OK".
    Пользовательский редактор свойств средства визуализации ячейки "JList", отображающий выбор "new Item"

Клиентское приложение готово! Сохраните все файлы и запустите приложение. (Щелкните правой кнопкой мыши узел проекта и выберите "Run"). Откроется приложение со списком сообщений ленты и полем, содержащим ваш статус.

Запуск клиента с отображением сообщений Twitter

Подключение через прокси

При подключении к Интернету через прокси необходимо настроить среду IDE и проект TwitterSwingClient для использования настроек прокси.

Для настройки среды IDE откройте "Tools" > "Options" > "General". Найдите раздел "Proxy Settings". Вы можете настроить прокси вручную, использовать системные настройки прокси или не использовать настройки прокси вообще. Среда IDE получает системные настройки прокси из системного веб-обозревателя по умолчанию.

Для проекта TwitterSwingClient необходимо указать для прокси протокол HTTP, используемый обработчиком. Эти действия описаны в документации Java SE 6. Прокси определяется в параметрах, передаваемых виртуальной машине. Данные параметры устанавливаются в диалоговом окне "Properties" посредством среды IDE NetBeans.

Определение прокси для проекта TwitterSwingClient:

  1. В окне "Projects" щелкните правой кнопкой мыши проект "TwitterSwingClient" и выберите "Properties". Откроется диалоговое окно "Properties".
  2. В дереве "Categories" выберите "Run". В окне появятся свойства "Run".
  3. Введите -Dhttp.proxyHost=server -Dhttp.proxyPort=port в поле "VM Options". Замените "server" и "port" на имя узла и порт вашего прокси-сервера.
    Настройки прокси в "VM options" в диалоговом окне "Project properties"

Дополнительные упражнения

Ниже предлагается еще несколько примеров для рассмотрения:

  • Измените значок пользователя в Twitter (в обозревателе) и запустите клиент заново. Убедитесь в том, что новый значок пользователя отображается.
  • Добавьте в JFrame панель инструментов с некоторыми функциями.

Дополнительные сведения

Для получения дополнительных сведений о применении среды IDE NetBeans для создания и использования веб-служб, а также разработки графических пользовательских интерфейсов, см. следующие ресурсы:

Чтобы оставить комментарии и предложения, обратиться за поддержкой или получить информацию о последних достижениях в области функциональных возможностей разработки для Java EE с помощью среды IDE NetBeans, подпишитесь на нашу рассылку .