Одним из множества классных примеров приложений, известных тем, кто пробует JavaFX, является приложение JavaFX Weather, которое теперь входит в комплект поставки среды IDE NetBeans 6.5.1 / JavaFX 1.2 . Короче говоря, он подключается к службе погоды и затем отображает результаты для выбранных городов в впечатляющем графическом интерфейсе JavaFX:
В среду на техническом занятии в JavaOne под названием «Язык программирования JavaFX + Groovy = Красота + Производительность» Дирк Кениг продемонстрировал ряд мощных способов взаимодействия Groovy и JavaFX. Один из этих способов описан ниже, со всем кодом и результатами. Это действительно впечатляет, и Дирк получил аплодисменты своей аудитории, когда он продемонстрировал это на своей сессии.
Приложение JavaFX Weather создает вышеуказанный графический интерфейс, используя этот массивный класс Java для подключения к службе погоды Yahoo. Канал RSS, к которому подключается класс Java, полностью показан ниже:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<channel>
<title>Yahoo! Weather - Prague, EZ</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html</link>
<description>Yahoo! Weather for Prague, EZ</description>
<language>en-us</language>
<lastBuildDate>Fri, 05 Jun 2009 8:00 pm CEST</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Prague" region="" country="EZ"/>
<yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/>
<yweather:wind chill="54" direction="60" speed="3" />
<yweather:atmosphere humidity="58" visibility="6.21" pressure="29.8" rising="0" />
<yweather:astronomy sunrise="4:56 am" sunset="9:06 pm"/>
<image>
<title>Yahoo! Weather</title>
<width>142</width>
<height>18</height>
<link>http://weather.yahoo.com</link>
<url>http://l.yimg.com/a/i/us/nws/th/main_142b.gif</url>
</image>
<item>
<title>Conditions for Prague, EZ at 8:00 pm CEST</title>
<geo:lat>50.1</geo:lat>
<geo:long>14.28</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html</link>
<pubDate>Fri, 05 Jun 2009 8:00 pm CEST</pubDate>
<yweather:condition text="Partly Cloudy" code="30" temp="54" date="Fri, 05 Jun 2009 8:00 pm CEST" />
<description><![CDATA[
<img src="http://l.yimg.com/a/i/us/we/52/30.gif"/>
<b>Current Conditions:</b>
Partly Cloudy, 54 F
<b>Forecast:</b>
Fri - Partly Cloudy. High: 58 Low: 42
Sat - PM Rain. High: 58 Low: 49
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html">Full Forecast at Yahoo! Weather</a>(provided by The Weather Channel)<br/>
]]>
</description>
<yweather:forecast day="Fri" date="5 Jun 2009" low="42" high="58" text="Partly Cloudy" code="29" />
<yweather:forecast day="Sat" date="6 Jun 2009" low="49" high="58" text="PM Rain" code="12" />
<guid isPermaLink="false">EZXX0012_2009_06_05_20_00_CEST</guid>
</item>
</channel>
</rss>
Теперь, когда вы слышите «Groovy», вы должны думать « хрюканье ». В этом Groovy особенно хорош. Очень яркий пример — это веб-сервисы. Кроме того, это парсинг HTML и XML. Поэтому, когда вам нужно взаимодействовать с веб-сервисами в вашем Java-приложении, самый очевидный вспомогательный язык, о котором вы должны подумать, это Groovy.
Посмотрите снова на RSS выше, а затем посмотрите на строку 11 в коде Groovy ниже. Вот эта строка:
def channel = new XmlParser().parse(url).channel
Эта строка возвращает вам элемент «канал» в RSS-канале выше! Круто, верно? И с этого момента скрипт Groovy, представленный ниже, анализирует RSS-канал, идентифицируя в точности те фрагменты, которые представляют интерес для графического интерфейса JavaFX, что приводит к ТОЧНО тому же результату, примерно в 20 строках, как в оригинале примерно в 250.
Взгляните на фрагмент Groovy ниже, чтобы увидеть, как он работает, сравнив его с RSS-каналом выше. Обратите внимание, что это даже не фрагмент! Это ВСЕ класс Groovy веб-сервис. Теперь это просто круто, особенно после того, как мы снова сравнили его с первоначальным чудовищем .
package weatherfx.service
class YahooWeatherServiceG {
static YW = new groovy.xml.Namespace("http://xml.weather.yahoo.com/ns/rss/1.0")
def forecasts
YahooWeatherServiceG(String code, boolean celsius) {
def url = "http://weather.yahooapis.com/forecastrss?u=f&p=$code"
println url.toURL().text
def channel = new XmlParser().parse(url).channel
cityName = channel[YW.location].@city
def wind = channel[YW.wind].first()
windSpeed = [email protected]()
windDirection = [email protected]()
def cond = channel.item[YW.condition].first()
temp = [email protected]()
forecasts = channel.item[YW.forecast]
}
String cityName
int temp
int windSpeed
int windDirection
int getConditionCode(int day=0) { forecasts[day][email protected]() }
int getLowsTemp (int day=0) { forecasts[day][email protected]() }
int getHighsTemp (int day=0) { forecasts[day][email protected]() }
}
Теперь уделите немного времени, чтобы представить, насколько проще, эффективнее и менее подвержено ошибкам (а) тестировать и (б) поддерживать приведенный выше код по сравнению с его исходной чистой версией Java.
Однако кросс-компилятора JavaFX / Groovy пока нет. Итак, как заменить код веб-службы Java на приведенный выше в Groovy? Создайте отдельный проект, в котором вы создадите свой веб-сервис Groovy. Затем добавьте этот проект в путь к классу вашего приложения JavaFX. Затем замените две или три ссылки в приложении JavaFX для ссылки на класс Groovy (который после компиляции теперь является классом Java) вместо исходного класса Java.
На одном рисунке вышеупомянутый абзац дает вам следующее:
Затем запустите приложение JavaFX, и вы получите тот же результат, что и раньше, с той разницей, что код веб-службы теперь обрабатывается в Groovy. И … в вашем приложении больше нет чистого Java-кода. О, Боже. JavaFX создает графический интерфейс, а Groovy выполняет всю работу в фоновом режиме. Итак, прощай, чистый Java-код?