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

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

Запущен клиент, в котором отображаются сообщения Twitter

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

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

Содержание

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

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

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

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

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

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

  1. Выберите команду "Файл" > "Новый проект". Откроется мастер создания проекта. Выберите категорию "Java category", затем выберите проект приложения "Java Application project". Нажмите кнопку "Далее".
  2. Присвойте проекту имя TwitterSwingClient. Выберите путь к папке проекта в поле "Project Location". Снимите флажок "Create Main Class". (JFrame станет главным классом). Нажмите кнопку "Завершить".
    Мастер создания проектов, в котором отображаются поля для создания проекта TwitterSwingClient
  3. В среде IDE будет создан проект TwitterSwingClient, отображаемый в окне "Projects". Щелкните правой кнопкой мыши узел проекта "TwitterSwingClient" и выберите "New" > "JFrame Form" (или "New" > "Other" > "Swing GUI Forms" > "JFrame Form"). Откроется мастер создания форм JFrame.
  4. Присвойте форме имя TwitterJFrame и создайте для нее пакет с именем twitterclient. Нажмите кнопку "Завершить".
    Мастер создания форм JFrame, в котором отображаются поля для создания TwitterJFrame
  5. TwitterJFrame будет открыт в представлении "Design" редактора среды IDE. В нем содержится палитра Swing с компонентами, которые можно перетащить в JFrame.
    Twitter J Frame в представлении проектирования редактора
  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 пикселей.
    Для свойств j Label 1 в Twitter J Frame отображаются размеры 'Максимальный', 'Минимальный' и 'Предпочитаемый', для которых заданы значения 48, 48
  12. Перетащите контейнер "Scroll Pane" в верхнюю часть JFrame. Растяните его границы так, чтобы он занимал большую часть или все пространство над текстовым полем и кнопкой. (Можно оставить некоторое пространство пустым для добавления дополнительных функций, например, меню в образце приложения.)
  13. Перетащите элемент "List" в "Scroll Pane". Появится список элементов. Сохраните TwitterJFrame. JFrame должен выглядеть, как изображено на рисунке ниже:
    Twitter J Frame в представлении проектирования редактора со всеми базовыми элементами графического интерфейса пользователя

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

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

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

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

  1. Перейдите в режим просмотра исходного кода TwitterJFrame.
  2. Нажмите Alt-Insert или щелкните правой кнопкой мыши и выберите в контекстном меню 'Вставить код'. Откроется меню вставляемого кода.
    Откроется меню вставляемого кода в метод initUserInfo
  3. Щелкните элемент "Создать клиент REST". Откроется диалоговое окно "Доступные ресурсы REST".
    Диалоговое окно "Доступные ресурсы REST"
  4. Выберите параметр "Зарегистрированные в среде IDE" и нажмите кнопку "Обзор". Перейдите к разделу Twitter > Twitter OAuth > [statuses] > [user_timeline.{format}]. Нажмите кнопку "ОК".
    Окно 'Службы' с деревом веб-служб, в котором показана выбранная операция 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;
    Фрагмент кода, в котором показывается переменная клиента непосредственно над внутренним классом
  9. Найдите метод main в TwitterJFrame. Перед этим методом создайте новый метод initUserInfo, вызывающий исключения MalformedURLException и IOException.
    private void initUserInfo() throws MalformedURLException, IOException {
    
    
    
    }
  10. Вставьте следующий код в тело метода initUserInfo. Комментарии в коде описывают выполняемые действия.
    private void initUserInfo() throws MalformedURLException, IOException {
    
    //Create an instance of the internal service class client = new Twitter_OAuth_user_timeline__format_JerseyClient("xml");
    //Log in, get tokens, and append the tokens to the consumer and secret //keys client.login(); client.initOAuth();
    //Call getUserTimeline, get a list of statuses, pass the most recent //status as a StatusType object, and display the text of that object //in the JTextField Statuses statuses = client.getUserTimeline(Statuses.class, null, null, null, "1"); StatusType st = statuses.getStatus().get(0); jTextField1.setText(st.getText().trim());
    //Get a UserType object from the StatusType object, get the URL of that //user's icon, and display that icon in the 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', отображающее службу форматирования обновления
  3. Повторите действия 1 и 2, чтобы добавить клиент для службы [friends_timeline.{format}].
  4. Измените имя исходного класса Twitter_OAuth_user_timeline__format_JerseyClient. Он будет общим классом, вызывающим все три службы. Выберите экземпляр с именем Twitter_OAuth_user_timeline__format_JerseyClient и нажмите Ctrl-R или щелкните правой кнопкой мыши и выберите 'Реорганизовать' > 'Переименовать'. Откроется диалоговое окно "Переименование класса". Введите новое имя TwitterClient.
    Диалоговое окно 'Переименовать класс' с новым именем TwitterClient
  5. Нажмите кнопку "Refactor" (Реорганизация). В среде 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 в представление 'Источник' с курсором в середине нового созданного метода 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.

  • Для получения имен пользователей и статусов из Twitter приложение вызывает операцию Twitter getFriendsTimeline при его запуске. Для настройки создайте новый метод run, который переопределит метод run в main. Вставьте вызовы getFriendsTimeline в этот метод.
  • Для автоматического обновления отображения, перенесите метод run, содержащий операцию getFriendsTimeline, в java.util.TimerTask, выполняющий метод run каждые 75 секунд.
  • Приложение отображает данные в виде ячеек в списке. Необходимо передать данные в компоненты графического пользовательского интерфейса, которые могут быть отображены в виде ячеек в списке. Также можно отформатировать отображение данных. Для этого создайте новый JPanel, реализующий javax.swing.ListCellRenderer. JPanel вернет объект java.awt.Component, передав имя пользователя и статус в JLabels. Измените формат JPanel.
  • В TwitterJFrame настройте JList для отображения объектов Component, возвращаемых посредством JPanel.

Создание TimerTask

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

Создание TimerTask:

  1. Откройте TwitterJFrame в представлении "Sources" редактора.
  2. Найдите объявление класса и конструктор.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Creates new form 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 {
    
        /** Creates new form 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. Щелкните правой кнопкой мыши в любом местоположении редактора и выберите 'Исправить выражения импорта' в контекстном меню или нажмите Ctrl/⌘-Shift-I. Открывается диалоговое окно, в котором можно выбрать классы для импорта. Добавьте оператор импорта для java.util.Timer.
  5. После создания экземпляра класса Timer, создайте новый метод Timer.scheduleAtFixedRate. Параметрами метода являются объект TimerTask, задержка перед первым выполнением задачи и частота выполнения задачи. Установите для метода время ожидания равным 30 секундам и частоту запуска равной 75 секундам. Начальная задержка позволяет войти в систему. Точный код, выделенный полужирным шрифтом, изображен на рисунке ниже. На месте вставки кода выполнения остается пустая строка. Обратите внимание, что для java.util.TimerTask необходимо добавить оператор импорта.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        /** Creates new form 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();
    
    /** Creates new form TwitterJFrame */ public TwitterJFrame() {
  2. Щелкните правой кнопкой мыши в любом местоположении редактора и выберите 'Исправить выражения импорта' в контекстном меню или нажмите Ctrl/⌘-Shift-I. В результате добавится оператор импорта для DefaultListModel.
  3. В теле объекта TimerTask создайте новый метод run. Используйте аннотацию @Override для переопределения метода run в main.
    public class TwitterJFrame extends javax.swing.JFrame {
    
        private DefaultListModel statuses = new DefaultListModel();

    /** Creates new form 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");
            // Clear the list model so it does not replicate the contents from the last run
            statusesListModel.clear();
            // Create a Status Type object for every status in the Status list, and add an element
            // to the list model for every status type object
            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, в котором отображается панель с именем 'Элемент' и пакет twitterclient
  3. Нажмите кнопку "Завершить". В представлении "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, в котором для 'Передний план' задан синий цвет
  7. Откройте диалоговое окно "Properties" панели "JTextPane" и попробуйте изменить различные настройки ее внешнего вида.
  8. Перейдите в представление "Source" для Item.java. Найдите блок "Generated Code" и разверните его. В результате отобразится код, созданный средой IDE при установке свойств "JLabel" и "JTextPane".

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

    Код, созданный Item.java путем задания свойств JLabel свойств в представлении конструктора
  9. Найдите объявление класса и добавьте код implements ListCellRenderer.
    public class Item extends javax.swing.JPanel implements ListCellRenderer {
  10. Нажмите Ctrl-Shift-I (⌘-Shift-I в MacOS). В результате добавится оператор импорта для 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 (⌘-Shift-I в MacOS). В результате будут добавлены операторы импорта для классов StatusType и Component. Выберите версию twitteroauth StatusType. Сохраните Item.java.

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

Вывод компонента в TwitterJFrame

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

  1. Вернитесь в TwitterJFrame. Выберите "JList" в представлении "Design". Щелкните правой кнопкой мыши и откройте "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, в котором показывается новый выбранный элемент

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

Запущен клиент, в котором отображаются сообщения Twitter

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

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

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

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

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

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

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

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

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

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

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

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

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo