IT • archiv

rus / eng | Логин | Добавить отзыв | Печать | Почта | Клуб




Инструменты


Создание графического web-приложения в VisualAge for Java 3.5. Дополнение

 
(Николай Зайкин)

Если вы пробовали создавать и запускать приложение MobileDictionary из первой статьи (графическое приложение на основе AWT классов) и из второй статьи (графическое приложение на основе Swing классов), то вероятно заметили разницу в поведении программ (а именно разница в поведении объектов текстовых областей - TextArea и JTextArea).

Если в AWT задание содержимого текстовой области TextArea незамедлительно вызывало обновление этой текстовой области:

   resultArea.setText("Searching ... Please, wait ...\n");

, то аналогичный код для JTextArea только сообщал JVM (Виртуальной Джава Машине), что произошло изменение содержимого текстовой области, но реальное обновление экрана происходило когда JVM считала нужным.

Если рассмотреть на примере программы, то она работала, как будто в ней не присутствовало следующего фрагмента кода:

outputText(
    "Searching ... Please, wait ...\n"
        + "Host : "
        + hostURL
        + "\n"
        + ((useProxy)
            ? "With proxy : " + proxyURL + ":" + proxyPort
                    : "Without proxy. Direct connection."));

и единственное, что видел пользователь после нажатия кнопки "Translate !", это либо результат перевода, либо сообщение о неудачной попытке создания HTTP соединения.

Ситуация аналогична с System.gc() - вы можете информировать, что желаете инициировать сборку мусора в JVM, но реально процесс произойдет независимо от вашего желания - через секунду или через 15 минут...

К счастью, разработчики JFC (пакеты Swing являются частью JFC - Java Fundamental Classes), предусмотрели метод paintImmidiately() для класса javax.swing.JComponent ("дедушки" JTextArea). Этот метод позволяет заставить JVM незамедлительно перерисовать содержимое компонента, задав координаты области перерисовки.

Итак, создадим к классе MobileDictionary новый метод:

public void outputText(String s) {
    ivjJTranslationTextArea.setText(s);
    ivjJTranslationTextArea.paintImmediately(
        0,
        0,
        ivjJTranslationTextArea.getWidth(),
        ivjJTranslationTextArea.getHeight());
}

и заменим весь вывод в текстовую область в методе performTranslation на вызовы метода outputText(String s), передавая в качестве параметра текст для вывода:
public void performTranslation() {
 try {
     int c;
     outputText(
         "Searching ... Please, wait ...\n"
             + "Host : "
             + hostURL
             + "\n"
             + ((useProxy)
                 ? "With proxy : " + proxyURL + ":" + proxyPort
                 : "Without proxy. Direct connection."));

     Properties sprop = System.getProperties();
     sprop.put("http.proxyHost", useProxy ? proxyURL : "");
     sprop.put("http.proxyPort", useProxy ? proxyPort : "");
     System.setProperties(sprop);

     URL hp =
         new URL(
             hostURL
                 + DICT_URL
                 + ivjJWordTextField.getText()
                 + MODE_ID
                 + typeDefault
                 + APP_ID);

     HttpURLConnection hpCon =
       (HttpURLConnection) hp.openConnection();
     int len = hpCon.getContentLength();
     if (len > 0) {
         outputText("Connected ... Please, wait ...");
         InputStream input = hpCon.getInputStream();
         InputStreamReader isr =
          new InputStreamReader(input, "Cp1251");

         int i = len;
         char ch;
         String tr = "";
         while (((c = isr.read()) != -1) && (--i > 0)) {
             tr += (char) c;
         }
         int eod = tr.indexOf("searching time =");
         eod = tr.indexOf("sec", eod) + 3;
         tr = tr.substring(0, eod);
         outputText(tr);
     } else {
         outputText("Error ! Connection to host failed !");
     }
 } catch (IOException e) {
     System.out.print(e);
 }
}

Теперь сразу же после нажатия кнопки "Translate !" или клавиши Enter в текстовом поле, выведется статус поиска:
Searching ... Please, wait ...
Host : bla-bla-bla
With proxy : bla-bla-bla:bla
и только через несколько секунд, в зависимости от качества вашей связи, вы получите на экране перевод...

Related links:

  1. Исходные коды к данной статье.

TOC




Справка | Условия Copyright © 1999 — 2010, IT • archiv.
В начало | Логин | Добавить отзыв | Поиск | Почта