<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1668751503451793669</id><updated>2011-07-29T05:12:07.940+09:00</updated><category term='一括変換型ＪａｖａＦＸ言語'/><category term='JavaFX 1.0 SDK'/><category term='個人用計算機徒然草'/><category term='ＪａｖａＦＸ言語'/><category term='不具合'/><category term='SCADA'/><category term='Apps'/><category term='JavaFX SDK'/><category term='JavaFX追加接続プログラム'/><category term='応用'/><category term='JavaFX'/><title type='text'>Terra's Weblog</title><subtitle type='html'>プログラミングを楽しむための情報を少しでも提供できたらと思い、ブログをはじめました。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>67</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-6432313275808662453</id><published>2009-07-02T18:08:00.006+09:00</published><updated>2009-07-02T20:06:15.496+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>JavaFX 1.2 追加接続プログラム（plug-in）が動くようになった</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;私は、まだ、NetBeans&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt; 6.5&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を使っています（6.5.1ではありません）。&lt;br /&gt;過日、JavaFX 1.2 SDKとJDK 6 Update 13を導入した際に、NetBeans用の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX追加接続プログラム（plug-in）も&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.2相当のものを&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;導入し直しました。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ところが、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFXの&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;プログラムを実行しようとすると、誤りが発生して実行できませんでした（見本の一部には実行できるものもありましたが･･･）。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;追加接続プログラムに問題があり、その版が更新されれば実行できるようになるだろうと放っておきました。&lt;br /&gt;ところが、本日たまたま古いJDKを整理し、それまで&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JDK 6 Update 11で動いていたNetBeans&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt; 6.5&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;が&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JDK 6 Update 13で動くようになったところ、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.2の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;プログラムも&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;正常に実行できるようになりました。&lt;br /&gt;JDKを整理しなくても、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;NetBeans&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の設定変更でうまく対処できるのかもしれません。私のように、「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;追加接続プログラムの問題&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;だ」とあきらめてしまう前に、一度調べてみると良いかもしれません。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;なお、先ごろ公開されたNetBeans 6.7へは、&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.2追加接続プログラムをうまく導入できないようです（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;NetBeans 6.7の導入ページにも、JavaFXは、NetBeans 6.5.1でのみ利用できまるとなってはいるのですが･･･&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;）。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;John O'Conner氏が何とかしようと&lt;/span&gt;&lt;/span&gt;奮闘&lt;span style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;（？）されているようなのですが。興味のある方は、&lt;a href="http://learningjavafx.com/tools/install-javafx12-nb67"&gt;彼のBlog&lt;/a&gt;をご覧ください。&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-6432313275808662453?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/6432313275808662453/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=6432313275808662453' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6432313275808662453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6432313275808662453'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/07/javafx-12-plug-in.html' title='JavaFX 1.2 追加接続プログラム（plug-in）が動くようになった'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-794817023557452520</id><published>2009-02-12T12:27:00.003+09:00</published><updated>2009-02-12T12:47:19.644+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>Servletから周期的にデータを取得するプログラムを作りました</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;Servletから周期&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;的にデータを取得して表示を更新する、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JavaFXの役務依頼器（client）&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラムを作ってみました。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_v58IVq86t4s/SZOXfnq7K0I/AAAAAAAAAEc/vC2d2rmv4Xs/s1600-h/MonitorServlet.JPG"&gt;&lt;img style="cursor: pointer; width: 180px; height: 150px;" src="http://3.bp.blogspot.com/_v58IVq86t4s/SZOXfnq7K0I/AAAAAAAAAEc/vC2d2rmv4Xs/s320/MonitorServlet.JPG" alt="" id="BLOGGER_PHOTO_ID_5301747755825965890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;Servletへ&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;1秒ごとにHTTPのGET要求を発行して数値データを文字列として取得し、棒図式と数字で実時間表示します&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;（遠隔監視（Remote Monitor）を模擬した表示にしてみました。Servletは、監視データの代わりに現在の秒値を返します）。&lt;br /&gt;コードの例は、&lt;a href="http://www.geocities.jp/terra_homepage/javafx/javafxexamples.html#C01S02"&gt;こちら&lt;/a&gt;に載せています。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-794817023557452520?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/794817023557452520/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=794817023557452520' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/794817023557452520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/794817023557452520'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/02/servlet_12.html' title='Servletから周期的にデータを取得するプログラムを作りました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_v58IVq86t4s/SZOXfnq7K0I/AAAAAAAAAEc/vC2d2rmv4Xs/s72-c/MonitorServlet.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-191143220390926465</id><published>2009-02-10T20:47:00.005+09:00</published><updated>2009-02-10T21:19:10.835+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>Servletと通信するプログラムを作りました</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;Servletと通信するJavaFXの役務依頼器（client）プログラムを作ってみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_v58IVq86t4s/SZFrY_0tuWI/AAAAAAAAAEU/W_vdLx_8QcY/s1600-h/HelloServlet.JPG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 137px;" src="http://4.bp.blogspot.com/_v58IVq86t4s/SZFrY_0tuWI/AAAAAAAAAEU/W_vdLx_8QcY/s320/HelloServlet.JPG" alt="" id="BLOGGER_PHOTO_ID_5301136313585351010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;br /&gt;「OK」ボタンが押されると、SwingTextFieldに入力された文字列を、HTTPのGET&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;要求としてServletへ送ります。Servletでは、HttpServletRequest#getParameter()で送られてきた文字列を読み込み、前後に文字列を付加して&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;依頼器へ送り返します。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;依頼器は、Servletから&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;受信した&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;文字列をTextとして表示します。&lt;br /&gt;コードの例は、&lt;a href="http://www.geocities.jp/terra_homepage/javafx/javafxexamples.html#C01S01"&gt;こちら&lt;/a&gt;に載せています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-191143220390926465?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/191143220390926465/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=191143220390926465' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/191143220390926465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/191143220390926465'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/02/servlet_10.html' title='Servletと通信するプログラムを作りました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_v58IVq86t4s/SZFrY_0tuWI/AAAAAAAAAEU/W_vdLx_8QcY/s72-c/HelloServlet.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3487773805340481525</id><published>2009-02-08T17:59:00.004+09:00</published><updated>2009-02-08T18:55:31.270+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>Servlet接続プログラム作成の参考文書</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;役務供給&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;器&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;（server）と通信する依頼&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;器&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;（client）側のJavaFXプログラムを開発する場合、試験用の供給&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;器&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;側プログラムをServletとして作成する、というのもひとつの手だと思います。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;NetBeansを利用すると、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;Servletプログラムの作成から配備までを容易に行うことができます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;今日は、Servletと接続するプログラムを作成する際に参考になる文書を紹介します。&lt;br /&gt;&lt;a href="http://piliq.com/javafx/?page_id=507"&gt;Connecting to Servlets&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3487773805340481525?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3487773805340481525/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3487773805340481525' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3487773805340481525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3487773805340481525'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/02/servlet.html' title='Servlet接続プログラム作成の参考文書'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-6281707411024786321</id><published>2009-02-05T16:08:00.007+09:00</published><updated>2009-02-05T17:58:29.306+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>段階式書式指定（CSS）に関する参考文書</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;段階式書式指定（CSS（Cascading Style Sheets））を利用したJavaFX応用プログラムを開発する上で、参考になるWeb日誌と投稿を紹介します。&lt;br /&gt;次のWeb日誌は、CSSとSkinクラスやControlクラスの関係について、簡潔な例を用いていて分かりやすく説明しています（表題には「Applets」とありますが、卓上型（desktop）プログラムとして実行できます）。&lt;br /&gt;&lt;a href="http://piliq.com/javafx/?page_id=355"&gt;Styling your Applets with CSS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上のWeb日誌の例を試すときは、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;CSSファイル「style.css」を&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;台本ファイルと同じディレクトリに置き、台本ファイル「Main.fx」の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;行&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;stylesheets: ["http://piliq.com/javafx/tutorials/css/style.css"];&lt;br /&gt;&lt;br /&gt;を、次のように書き替えてから一括変換してください。&lt;br /&gt;&lt;br /&gt;stylesheets: ["{__DIR__}style.css"];&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;CSSファイルの設定を書き替えると、台本ファイルを一括変換しなおさなくても、（台本を再実行しただけで）変更が反映されるのが分かります。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;次の投稿には、段階式書式指定について詳しく説明されています。&lt;/span&gt;&lt;br /&gt;&lt;a href="http://forums.sun.com/thread.jspa?threadID=5357325&amp;amp;tstart=0"&gt;&lt;span style="font-family:lucida grande;"&gt;CSS support control and skinning&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;上の投稿と次のWeb日誌をあわせて読むと、より分かりやすいかもしれません。&lt;/span&gt;&lt;br /&gt;&lt;a href="http://weblogs.java.net/blog/javakiddy/archive/2008/12/javafx_in_style.html"&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX in Style&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-6281707411024786321?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/6281707411024786321/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=6281707411024786321' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6281707411024786321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6281707411024786321'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/02/css.html' title='段階式書式指定（CSS）に関する参考文書'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4286328023281283085</id><published>2009-01-29T02:03:00.004+09:00</published><updated>2009-01-29T02:13:16.156+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>作成時に列幅が指定可能な表部品を作ってみました</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;「Planet JFX Wiki」に、&lt;/span&gt;&lt;a style="font-family: lucida grande;" href="http://jfx.wikia.com/wiki/SwingComponents#Table"&gt;javax.swing.JTableを使ったTable部品&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;の見本が載っています。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;それにちょっと手を加えて、表を作成する際に列幅を指定できるようにしてみました。&lt;/span&gt;&lt;p  align="left" style="font-family:lucida grande;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_v58IVq86t4s/SYCRIX_mcOI/AAAAAAAAAD8/mKQ4F-LGavo/s1600-h/TableSample1.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 174px;" src="http://2.bp.blogspot.com/_v58IVq86t4s/SYCRIX_mcOI/AAAAAAAAAD8/mKQ4F-LGavo/s320/TableSample1.JPG" alt="" id="BLOGGER_PHOTO_ID_5296392734853460194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  align="left" style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  align="left" style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  align="left" style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  align="left" style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  align="left" style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p face="lucida grande" align="left"&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p face="lucida grande" align="left"&gt;&lt;span style="font-family:lucida grande;"&gt;コードの例は、&lt;a href="http://www.geocities.jp/terra_homepage/javafx/javafxhints.html#TableJTable"&gt;こちら&lt;/a&gt;に載せています。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4286328023281283085?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4286328023281283085/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4286328023281283085' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4286328023281283085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4286328023281283085'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/01/blog-post.html' title='作成時に列幅が指定可能な表部品を作ってみました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_v58IVq86t4s/SYCRIX_mcOI/AAAAAAAAAD8/mKQ4F-LGavo/s72-c/TableSample1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1355787999207294990</id><published>2009-01-27T16:51:00.004+09:00</published><updated>2009-01-27T21:12:13.727+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>HTTP、XMLおよびJSONに関する参考文書</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;JavaFXといえばRIAなので、今日は、HTTP、XMLおよびJSONの処理に関して、参考になるWeb日誌と応用見本のWeb面を紹介したいと思います。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;HTTPとXML&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;に関する&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;簡単&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;な応用例として、次の2つのWeb日誌が参考になります。&lt;br /&gt;&lt;a href="http://silveiraneto.net/2008/12/25/parsing-xml-sandwich-with-javafx/"&gt;Parsing a XML Sandwich with JavaFX&lt;/a&gt;&lt;br /&gt;&lt;a href="http://silveiraneto.net/2009/01/04/reding-twitter-with-javafx/"&gt;Reading Twitter with JavaFX&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;HTTPとXMLの&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;応用見本としては、次のものが簡潔で分かりやすいと思います。&lt;/span&gt;&lt;br /&gt;&lt;a href="http://javafx.com/samples/InterestingPhotos/"&gt;Interesting Photos : JavaFX Example Application&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;また、次のものは、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;HTTP、XMLおよびJSON&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の3つとも取り上げています。&lt;/span&gt;&lt;br /&gt;&lt;a href="http://javafx.com/samples/LocalSearch/"&gt;Location-Based Coffee Shop Search&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1355787999207294990?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1355787999207294990/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1355787999207294990' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1355787999207294990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1355787999207294990'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/01/httpxml.html' title='HTTP、XMLおよびJSONに関する参考文書'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-5897937338679600101</id><published>2009-01-22T13:51:00.002+09:00</published><updated>2009-01-22T13:59:17.373+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>「JavaFXプログラミング言語の基礎補遺」を公開しました</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;&lt;a href="http://www.geocities.jp/terra_homepage/javafx/index.html"&gt;JavaFXに関するWeb面&lt;/a&gt;で、「&lt;/span&gt;&lt;a style="font-family: lucida grande;" href="http://www.geocities.jp/terra_homepage/javafx/addendumofjavafxlanguage.html"&gt;JavaFXプログラミング言語の基礎補遺&lt;/a&gt;&lt;span style="font-family: lucida grande;"&gt;」を公開しました。「&lt;/span&gt;&lt;a style="font-family: lucida grande;" href="http://www.geocities.jp/terra_homepage/javafx/basicsofjavafxlanguage.html"&gt;JavaFXプログラミング言語の基礎&lt;/a&gt;&lt;span style="font-family: lucida grande;"&gt;」では取り上げなかった細かなことや、やや発展的な事項について記述しました。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-5897937338679600101?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/5897937338679600101/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=5897937338679600101' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5897937338679600101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5897937338679600101'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/01/javafx.html' title='「JavaFXプログラミング言語の基礎補遺」を公開しました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3255533876068994071</id><published>2009-01-11T11:57:00.004+09:00</published><updated>2009-01-11T12:12:51.043+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>Spinner部品を作ってみました</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;以前あったSpinnerクラスがJavaFX 1.0にはないので、JSpinnerを基に作ってみました。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_v58IVq86t4s/SWlhxq3rQfI/AAAAAAAAAD0/3-m2PPgYSe0/s1600-h/IntSpinner.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 209px; height: 127px;" src="http://1.bp.blogspot.com/_v58IVq86t4s/SWlhxq3rQfI/AAAAAAAAAD0/3-m2PPgYSe0/s320/IntSpinner.JPG" alt="" id="BLOGGER_PHOTO_ID_5289866743272653298" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;コードの例は、&lt;a href="http://www.geocities.jp/terra_homepage/javafx/javafxhints.html#SpinnerJSpinner"&gt;こちら&lt;/a&gt;に載せています。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3255533876068994071?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3255533876068994071/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3255533876068994071' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3255533876068994071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3255533876068994071'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2009/01/spinner.html' title='Spinner部品を作ってみました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_v58IVq86t4s/SWlhxq3rQfI/AAAAAAAAAD0/3-m2PPgYSe0/s72-c/IntSpinner.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-8738240552545070019</id><published>2008-12-24T05:11:00.006+09:00</published><updated>2008-12-24T08:12:01.866+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>JavaFX追加接続の下見機能でWYSIWYG開発が可能に</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;ちょっと古めかしい言葉を出してしまいましたが、MSのVisual StudioやNetBeansの&lt;span style="font-family: lucida grande;"&gt;Matisse&lt;/span&gt;&lt;/span&gt;のような&lt;span style="font-family: lucida grande;"&gt;WYSIWYG環境でのソフトウェ開発が、JavaFXでも可能になりました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;それは、NetBeansなどのIDE用に提供されている、JavaFX追加接続（plug-in）プログラムの下見（preview）機能を利用した開発のことです。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;Visual Studioや&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-family: lucida grande;"&gt;Matisseのような、直接操作方式ではありませんが、編集作業と並行して実行時の姿が実時間で見られるので、かなり開発効率が上がります。&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;事前評価（preview）版の&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JavaFX&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;追加接続にもその原型はあったのですが、原始コードの編集領域を分割して表示するため編集領域が狭くなる、コードによってはうまく表示ができないなど、正直言って「今一」の感が否めませんでした。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;しかし、JavaFX 1.0対応版では、これらの点かなり改善さているようです（まだ、それほど試した訳ではないので、問題点の有無を把握し切れてはいませんが）。&lt;br /&gt;少なくとも、下見画面がIDEの窓とは独立した専用の窓に表示されるため、編集領域が狭くなることはありません。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-family: lucida grande;"&gt;直接操作方式&lt;/span&gt;ではありませんが、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;元々&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JavaFX言語は宣言型の言語であり、VBやJavaに比べれば、画面表示とコードの対応が取りやすいこともあって、それほど苦にはなりません（もちろん、図形部品をマウスで引っ張りまわして好きな位置に配置したり、寸法を自由に変えられることに越したことはないのですが）。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-8738240552545070019?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/8738240552545070019/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=8738240552545070019' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8738240552545070019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8738240552545070019'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/12/javafxwysiwyg.html' title='JavaFX追加接続の下見機能でWYSIWYG開発が可能に'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-2723100107650466004</id><published>2008-12-23T11:26:00.003+09:00</published><updated>2008-12-23T11:35:00.605+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>JavaFX 1.0 SDK Update 1公開</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.0 SDK Update 1が、12月19日に公開されました。公開直後は、導入用プログラムが&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;更新前のものしか公開されていなかったのですが、今日改めて見てみたら、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.0 SDK Update 1用の導入プログラムに変更されていましたので、早速導入してしまいました。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-2723100107650466004?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/2723100107650466004/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=2723100107650466004' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2723100107650466004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2723100107650466004'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/12/javafx-10-sdk-update-1.html' title='JavaFX 1.0 SDK Update 1公開'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-5818840637566532833</id><published>2008-12-16T15:46:00.005+09:00</published><updated>2008-12-16T16:03:17.720+09:00</updated><title type='text'>狼おじさんになってしまうところでした</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;昨日、私の不注意から、JavaFXのcontinue式に不具合があるとの投稿をしてしまいました。&lt;br /&gt;再度確認したところ、continue式には、私が指摘したような不具合はないことが分かりました。&lt;br /&gt;ここに、訂正して、お詫びいたします。&lt;br /&gt;なお、誤った情報をこれ以上広めたくありませんので、まことに勝手ながら昨日の投稿は削除いたしました。&lt;br /&gt;貴重なご指摘をいただいた、雪羽  さんどうもありがとうございました。ここに、お礼を述べさせていただきます。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-5818840637566532833?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/5818840637566532833/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=5818840637566532833' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5818840637566532833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5818840637566532833'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/12/blog-post.html' title='狼おじさんになってしまうところでした'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-7183735469163348139</id><published>2008-12-13T14:47:00.003+09:00</published><updated>2008-12-16T12:36:41.516+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='不具合'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX 1.0 SDK'/><title type='text'>NetBeans用JavaFX追加接続プログラム日本語表示不具合</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;JavaFX言語の入門書「&lt;/span&gt;&lt;a href="http://www.geocities.jp/terra_homepage/javafx/index.html"&gt;JavaFXプログラミング言語の基礎&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;」を書き始め、まだ第1章だけですが&lt;a href="http://www.geocities.jp/terra_homepage/javafx/basicsofjavafxlanguage.html"&gt;Webページ&lt;/a&gt;で公開しました。&lt;br /&gt;そこに載せている見本コードの動作確認をしていて分かったのですが、NetBeans用JavaFX追加接続プログラム（JavaFX 1.0相当版：JavaFX 1.0バージョン1.4.3、JavaFX SDK for Windowsバージョン1.3.3）の日本語表示には、まだ未修正の不具合があります。&lt;br /&gt;これは、&lt;a href="http://terrasweblog.blogspot.com/2008/07/blog-post.html"&gt;以前の投稿&lt;/a&gt;で記したものですが、標準出力に日本語文字列を表示するようなプログラムを一括変換すると誤りが発生するというものです。同じプログラムを、JavaFX 1.0 SDKのjavafxcでコマンド行から一括変換すると正常に変換でき、日本語が表示できます。したがって、Windows上で動作する&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;NetBeans用JavaFX追加接続プログラムの標準出力への日本語表示に、問題が残っているようです。ちなみに、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;枠付き窓に日本語が表示できない不具合は、修正されています。&lt;br /&gt;話は変わりますが、以前から、JavaFX言語は、表現力が高いばかりでなく、初心者がプログラミングを習得するのにも適した言語&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;であると思っています&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。Java言語ですと、何はともあれ、「class」を定義しなければなりません。そこで、クラスとは何なのかの話をいきなり始めるか、「とりあえず、おまじない（？）と思って記述してください」と、クラスに関する説明を後回しにするかの選択をしなければなりません。&lt;br /&gt;いずれにしても、説明する方も、また説明される方もあまりすっきりしません。&lt;br /&gt;その点、JavaFXなら、println()関数の説明をするぐらいで「Hello world!」プログラムが書けますので、話が簡単です。また、JavaFX 1.0では、データ型の推定機能が復活しましたので、その点でもプログラミングが楽になります。しかも、動画や多重媒体応用プログラムが簡潔に書けるまでになります。&lt;br /&gt;「JavaFX言語でプログラミングを学ぶ」といった講座が一般的になる、そんな日が早く来るといいのですが。&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-7183735469163348139?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/7183735469163348139/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=7183735469163348139' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7183735469163348139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7183735469163348139'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/12/netbeansjavafx.html' title='NetBeans用JavaFX追加接続プログラム日本語表示不具合'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-6712675594746194363</id><published>2008-12-05T17:11:00.004+09:00</published><updated>2008-12-05T17:48:36.297+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><title type='text'>JavaFX 1.0 SDKが公開されました</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.0 SDKが公開されましたので、早速導入してみました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.0 SDKは、&lt;a href="http://javafx.com/"&gt;JavaFX.com&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の&lt;a href="http://javafx.com/downloads/windows.jsp"&gt;Start&lt;/a&gt;ページから導入できます。なお、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;同ページには、「&lt;a href="http://java.sun.com/javafx/1/tutorials/core/"&gt;Learning the JavaFX Script Programming Language&lt;/a&gt;」という指導書への連結が載っていますが、その指導書の中に記載されている&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.0 SDK導入ページの連結をたどると、本日（12/5）現在では、事前評価（Preview）版の導入ページに案内されてしまいます。上記のStartページから導入すると、正式版が導入できます。&lt;br /&gt;また、上記の指導書には、JDK 5またはJDK 6が必要と記されていますが、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX 1.0 SDKを導入しようとすると、最新の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JDK 6u11を導入するように求められます。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-6712675594746194363?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/6712675594746194363/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=6712675594746194363' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6712675594746194363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6712675594746194363'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/12/javafx-10-sdk.html' title='JavaFX 1.0 SDKが公開されました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-5376233485238037837</id><published>2008-10-08T18:08:00.008+09:00</published><updated>2008-12-28T15:07:56.635+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apps'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFX Air Hockey program</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_v58IVq86t4s/SP71ptuieAI/AAAAAAAAADk/4olcd-iC9UY/s1600-h/BlogSampleAirHockey.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_v58IVq86t4s/SP71ptuieAI/AAAAAAAAADk/4olcd-iC9UY/s320/BlogSampleAirHockey.JPG" alt="" id="BLOGGER_PHOTO_ID_5259911511813552130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I made a Air Hockey game in JavaFX.&lt;br /&gt;As for the program, named AirHockey.fx, plese refer to the&lt;a href="http://www.geocities.jp/terra_homepage/javafx/javafxexamples.html#C03S01"&gt; code&lt;/a&gt; (modified to conform to JavaFX 1.0).&lt;br /&gt;When you run the program, an air hockey game table with two aqua color mallets are displayed on your screen. Computer's goal (the upper one) and your goal (the lower one) are  displayed in burlywood color.&lt;br /&gt;Push the "SET" button to start the game. Then, a white puck appears on your side.&lt;br /&gt;You can manipulate your mallet by the mouse as long as it resides in your area.&lt;br /&gt;A velocity of your mallet is computed from its displacement by applying the scaling transformation. The scaling is modulated by the&lt;span style="font-style: italic;"&gt; velocityScaling&lt;/span&gt; factor. You can make your mallet's velocity more real by moving the factor closer to 1.0.&lt;br /&gt;You can also regulate the bounce back speed by adjusting the elastic modulus &lt;span style="font-style: italic;"&gt;elastic&lt;/span&gt;.&lt;br /&gt;In this program, a computer simply move its mallet back and forth. It has no ability  to take the offensive. It is your business to make your opponent cool.&lt;br /&gt;Enjoy yourself!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-5376233485238037837?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/5376233485238037837/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=5376233485238037837' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5376233485238037837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5376233485238037837'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/10/javafx-air-hockey-program.html' title='JavaFX Air Hockey program'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_v58IVq86t4s/SP71ptuieAI/AAAAAAAAADk/4olcd-iC9UY/s72-c/BlogSampleAirHockey.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-5416140302253169049</id><published>2008-10-07T16:45:00.013+09:00</published><updated>2008-10-07T18:12:20.370+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='応用'/><title type='text'>JavaFXで空中ホッケー遊技（Air hockey game）を作る</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_v58IVq86t4s/SOsWqNBPfXI/AAAAAAAAACs/bjfsuf6hvpM/s1600-h/BlogSampleAirHockey.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_v58IVq86t4s/SOsWqNBPfXI/AAAAAAAAACs/bjfsuf6hvpM/s320/BlogSampleAirHockey.JPG" alt="" id="BLOGGER_PHOTO_ID_5254318304563002738" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFXで、空中ホッケー遊技（Air hockey game）を作ってみました。&lt;br /&gt;頭の中が沸騰しそうになったとき、しばらく空っぽにするのにいいですよ。&lt;br /&gt;プログラムを実行すると、右の図のような&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;空中ホッケーの卓が表示されます。薄茶色で表示されているところが得点圏（goal）で、青緑色で表示されているのが槌（mallet）です。&lt;br /&gt;「SET」ボタンを押すと、図の位置に白い円盤（puck）が表示されます（プログラムを実行した直後や、得点した後は、円盤が表示されません）。&lt;br /&gt;人間様用の槌（下側が「人間様」の領域で、上側が「計算機様」の領域です）をマウスで動かして（人間様の領域内にマウスを持っていくと、その後を槌が追います）、円盤を打ってみてください。&lt;br /&gt;槌を速く動かしすぎると、槌で円盤を引きずるような動作をします。これは、マウスの位置の変化量から槌の速度を計算する際に、スケーリング変換を行っているためです。velocityScalingの値で、変換係数を調節してください。&lt;br /&gt;また、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;円盤が&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;卓の壁や槌に衝突してはね返されるとき、弾性係数を考慮して動きを計算しています。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;elasticの値で、弾性率を変えてみてください。&lt;br /&gt;今回のものでは、計算機様は、ただ槌を往復させるだけで、何の芸も持ち合わせていません。計算機様にどんな芸を持たせるかが、これからの楽しみです。何の制限も持たせなければ、計算機様をいくらでも強くできますが、それでは勝負になりません。強過ぎても弱過ぎてもだめですし、（乱数に因らない）偶然の要素もないと面白くない、その辺りが工夫のしどころです。&lt;br /&gt;最後に、原始コードを載せておきます。なお、&lt;a href="http://terrasweblog.blogspot.com/2008/09/blog-post.html"&gt;前回の投稿&lt;/a&gt;で、仕立て節に定義した関数がうまく機能しないと記しましたが、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（部品化を考慮して）&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;仕立て節を別の台本ファイルで定義したことがまずかっただったようです。このプログラムのように、同じ台本ファイル内に仕立て節を定義する限り、特に問題はありませんでした。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;/*&lt;br /&gt; * AirHockey.fx&lt;br /&gt; * The air hockey game.&lt;br /&gt; *&lt;br /&gt; * Created and modified:&lt;br /&gt; * V 1.0.0    2008/09/25&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package game;&lt;br /&gt;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.application.*;&lt;br /&gt;import javafx.input.*;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.effect.*;&lt;br /&gt;import javafx.scene.effect.light.*;&lt;br /&gt;import javafx.scene.geometry.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author terra&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;var goalCorners: Disc[];&lt;br /&gt;var mouseEvent: MouseEvent;&lt;br /&gt;&lt;br /&gt;var tableWidth: Number = 300;&lt;br /&gt;var tableHeight: Number = 400;&lt;br /&gt;var goalWidth: Number = 80;&lt;br /&gt;var goalCornerRadius: Number = 5;&lt;br /&gt;var puckRadius: Number = 10;&lt;br /&gt;var malletRadius: Number = 15;&lt;br /&gt;var hittingAreaDepth: Number = tableHeight / 2 - malletRadius;&lt;br /&gt;var elastic: Number = 0.95;&lt;br /&gt;var velocityScaling = 0.35;&lt;br /&gt;var malletCMaxV = 2;      // Maximum velocity of the computer's mallet.&lt;br /&gt;&lt;br /&gt;var timingGenerator: Timeline = Timeline {&lt;br /&gt;  repeatCount: Timeline.INDEFINITE&lt;br /&gt;  keyFrames: KeyFrame {&lt;br /&gt;    time: 20ms&lt;br /&gt;    action: function(): Void {&lt;br /&gt;      malletC.move();&lt;br /&gt;      puck.move();&lt;br /&gt;      malletH.calcuVelocity();&lt;br /&gt;      puck.collide(malletH);&lt;br /&gt;      puck.collide(malletC);&lt;br /&gt;      for (corner in goalCorners) {&lt;br /&gt;        puck.collide(corner);&lt;br /&gt;      }&lt;br /&gt;      score.judgeGoal();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var puck: Puck = Puck {&lt;br /&gt;//  x: goalCornerRadius + tableWidth / 2&lt;br /&gt;//  y: goalCornerRadius + 2 * tableHeight/ 3&lt;br /&gt;  x: -(puckRadius + 1)&lt;br /&gt;  y: goalCornerRadius + tableHeight / 2&lt;br /&gt;  radius: puckRadius&lt;br /&gt;  vX: 0, vY: 0&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var malletH: MalletH = MalletH {        // Human's mallet.&lt;br /&gt;  x: bind mouseEvent.getStageX()&lt;br /&gt;  y: bind mouseEvent.getStageY()&lt;br /&gt;  radius: malletRadius&lt;br /&gt;  color: Color.AQUA&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var malletC: MalletC = MalletC {        // Computer's mallet.&lt;br /&gt;  x: goalCornerRadius + tableWidth / 2&lt;br /&gt;  y: goalCornerRadius + malletRadius + puckRadius&lt;br /&gt;  radius: malletRadius&lt;br /&gt;  color: Color.AQUA&lt;br /&gt;  vX: malletCMaxV, vY: 0&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;for (i in [0..1]) {&lt;br /&gt;  for (j in [0..1]) {&lt;br /&gt;    insert Disc {&lt;br /&gt;      x: (tableWidth - goalWidth) / 2  + j * goalWidth&lt;br /&gt;      y: i * (2 * goalCornerRadius + tableHeight)&lt;br /&gt;      radius: goalCornerRadius&lt;br /&gt;      color: Color.LIGHTGREY&lt;br /&gt;    } into goalCorners;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var score: Score = Score{}&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;  title: "Air hockey"&lt;br /&gt;  width: 2 * goalCornerRadius + tableWidth + 56 as Integer&lt;br /&gt;  height: 2 * goalCornerRadius + tableHeight + 28 as Integer&lt;br /&gt;  visible: true&lt;br /&gt;  closeAction: function(): Void {System.exit(0);}&lt;br /&gt;  stage: Stage {&lt;br /&gt;    width: 2 * goalCornerRadius + tableWidth as Integer&lt;br /&gt;    height: 2 * goalCornerRadius + tableHeight as Integer&lt;br /&gt;    fill: Color.LIGHTGRAY&lt;br /&gt;    content: [&lt;br /&gt;      Rectangle {     // Jointed goal area.&lt;br /&gt;        x: (tableWidth - goalWidth) / 2&lt;br /&gt;        y: 0&lt;br /&gt;        width: goalWidth&lt;br /&gt;        height: 2 * goalCornerRadius + tableHeight +2&lt;br /&gt;        fill: Color.BURLYWOOD&lt;br /&gt;      },Rectangle {       // Table.&lt;br /&gt;        x: goalCornerRadius, y: goalCornerRadius&lt;br /&gt;        width: tableWidth, height: tableHeight&lt;br /&gt;        fill: Color.OLIVE&lt;br /&gt;      },&lt;br /&gt;      Rectangle {       // Human's hittig area.&lt;br /&gt;        x: goalCornerRadius + malletRadius&lt;br /&gt;        y: goalCornerRadius + tableHeight - hittingAreaDepth&lt;br /&gt;        width: tableWidth - 2 * malletRadius&lt;br /&gt;        height: hittingAreaDepth - malletRadius&lt;br /&gt;        fill: Color.OLIVE&lt;br /&gt;        onMouseMoved: function(ev: MouseEvent): Void {&lt;br /&gt;          mouseEvent = ev;&lt;br /&gt;        }&lt;br /&gt;      },&lt;br /&gt;      Line {      // Center line.&lt;br /&gt;        startX: goalCornerRadius&lt;br /&gt;        startY: goalCornerRadius + tableHeight / 2&lt;br /&gt;        endX: goalCornerRadius + tableWidth -1&lt;br /&gt;        endY: goalCornerRadius + tableHeight / 2&lt;br /&gt;        stroke: Color.BLUE&lt;br /&gt;      },&lt;br /&gt;      puck,&lt;br /&gt;      malletH,&lt;br /&gt;      malletC,&lt;br /&gt;      goalCorners,&lt;br /&gt;      ScoreIndicator {&lt;br /&gt;        x: 2 * goalCornerRadius + tableWidth + 5 as Integer&lt;br /&gt;        y: goalCornerRadius + tableHeight / 2 - 24 as Integer&lt;br /&gt;        score: bind score.scoreC&lt;br /&gt;      },&lt;br /&gt;      ScoreIndicator {&lt;br /&gt;        x: 2 * goalCornerRadius + tableWidth + 5 as Integer&lt;br /&gt;        y: goalCornerRadius + tableHeight / 2 + 5 as Integer&lt;br /&gt;        score: bind score.scoreH&lt;br /&gt;      },&lt;br /&gt;      Rectangle {       // "SET" button.&lt;br /&gt;        x: 2 * goalCornerRadius + tableWidth + 5 as Integer&lt;br /&gt;        y: goalCornerRadius + tableHeight - 30 as Integer&lt;br /&gt;        width: 35, height: 30&lt;br /&gt;        arcWidth: 8, arcHeight: 8&lt;br /&gt;        fill: Color.DARKGREY&lt;br /&gt;        effect: Lighting {&lt;br /&gt;          light: DistantLight {&lt;br /&gt;            azimuth: 225, elevation: 50&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;        onMousePressed: function(ev: MouseEvent): Void {&lt;br /&gt;          puck.x = goalCornerRadius + tableWidth / 2;&lt;br /&gt;          puck.y = goalCornerRadius + 2 * tableHeight/ 3;&lt;br /&gt;          puck.vX = 0;&lt;br /&gt;          puck.vY = 0;&lt;br /&gt;          timingGenerator.start();&lt;br /&gt;        }&lt;br /&gt;      },&lt;br /&gt;      Text {&lt;br /&gt;        x: 2 * goalCornerRadius + tableWidth + 10 as Integer&lt;br /&gt;        y: goalCornerRadius + tableHeight - 20 as Integer&lt;br /&gt;        textOrigin: TextOrigin.TOP&lt;br /&gt;        fill: Color.YELLOW&lt;br /&gt;        font: Font {&lt;br /&gt;          size: 14&lt;br /&gt;          name: "Monospaced", style: FontStyle.BOLD&lt;br /&gt;        }&lt;br /&gt;        effect: DropShadow {&lt;br /&gt;          offsetX: 3, offsetY: 3, radius: 2&lt;br /&gt;          color: Color.BLACK&lt;br /&gt;        }&lt;br /&gt;        content: "SET"&lt;br /&gt;      } &lt;br /&gt;    ]&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Disc extends CustomNode {&lt;br /&gt;  attribute x: Number;&lt;br /&gt;  attribute y: Number;&lt;br /&gt;  attribute radius: Number;&lt;br /&gt;  attribute color: Color = Color.WHITE;&lt;br /&gt;  attribute vX: Number;&lt;br /&gt;  attribute vY: Number;&lt;br /&gt;  attribute lastX: Number = x;&lt;br /&gt;  attribute lastY: Number = y;&lt;br /&gt;    &lt;br /&gt;  function create(): Node {&lt;br /&gt;    return Circle {&lt;br /&gt;      centerX: bind x, centerY: bind y&lt;br /&gt;      radius: bind radius&lt;br /&gt;      fill: bind color&lt;br /&gt;    };&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Puck extends Disc {&lt;br /&gt;  function move(): Void {&lt;br /&gt;    x += vX;&lt;br /&gt;    y += vY;&lt;br /&gt;&lt;br /&gt;    if (x + radius &gt; goalCornerRadius + tableWidth) {&lt;br /&gt;      x = goalCornerRadius + tableWidth - radius;&lt;br /&gt;      vX *= -1.0 * elastic;&lt;br /&gt;    } else if (x - radius &amp;lt; goalCornerRadius) {&lt;br /&gt;      x = goalCornerRadius + radius;&lt;br /&gt;      vX *= -1.0 * elastic;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if (x &gt;= 0) {&lt;br /&gt;      if (y &gt; 2 * goalCornerRadius + tableHeight) {&lt;br /&gt;        // It crossed the Human's goal line.&lt;br /&gt;        x = -(radius + 1);&lt;br /&gt;        y = 2 * goalCornerRadius + tableHeight + radius;&lt;br /&gt;        vX = 0;&lt;br /&gt;        vY = 0;&lt;br /&gt;      } else if (y + radius &gt; tableHeight + goalCornerRadius) {&lt;br /&gt;        if ((x &amp;lt; (tableWidth - goalWidth) / 2) &lt;br /&gt;            or (x &gt; (tableWidth + goalWidth) / 2)) {&lt;br /&gt;          y = tableHeight + goalCornerRadius - radius;&lt;br /&gt;          vY *= -1.0 * elastic;&lt;br /&gt;        }&lt;br /&gt;      } else if (y &amp;lt; 0) {&lt;br /&gt;        // It crossed the computer's goal line.&lt;br /&gt;        x = -(radius + 1);&lt;br /&gt;        y = -radius;&lt;br /&gt;        vX = 0;&lt;br /&gt;        vY = 0;&lt;br /&gt;      } else if (y - radius &amp;lt; goalCornerRadius) {&lt;br /&gt;        if ((x &amp;lt; (tableWidth - goalWidth) / 2) &lt;br /&gt;            or (x &gt; (tableWidth + goalWidth) / 2)) {&lt;br /&gt;          y = goalCornerRadius + radius;&lt;br /&gt;          vY *= -1.0 * elastic;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  function collide(disc: Disc): Void {&lt;br /&gt;    var distX: Number = disc.x - x;&lt;br /&gt;    var distY: Number = disc.y - y;&lt;br /&gt;    var minDist: Number = disc.radius + radius;&lt;br /&gt;    var dist2: Number = distX * distX + distY * distY;&lt;br /&gt;    var minDist2: Number = minDist * minDist;&lt;br /&gt;&lt;br /&gt;    if (dist2 &amp;lt; minDist2) {&lt;br /&gt;      var colAngle: Number = Math.atan2(distY, distX);&lt;br /&gt;      var sinColAngle: Number = Math.sin(colAngle);&lt;br /&gt;      var cosColAngle: Number = Math.cos(colAngle);&lt;br /&gt;&lt;br /&gt;      var expres1: Number = disc.vX * cosColAngle + disc.vY * sinColAngle;&lt;br /&gt;      var expres2: Number = vX * sinColAngle - vY * cosColAngle;&lt;br /&gt;      var expres3: Number = vX * cosColAngle + vY * sinColAngle;&lt;br /&gt;&lt;br /&gt;      x = disc.x - minDist * cosColAngle;&lt;br /&gt;      y = disc.y - minDist * sinColAngle;&lt;br /&gt;&lt;br /&gt;      vX = (1+ elastic) * expres1 * cosColAngle + expres2 * sinColAngle &lt;br /&gt;          - elastic * expres3 * cosColAngle;&lt;br /&gt;      vY = (1+ elastic) * expres1 * sinColAngle - expres2 * cosColAngle&lt;br /&gt;          - elastic * expres3 * sinColAngle;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MalletH extends Disc {&lt;br /&gt;  function calcuVelocity(): Void {&lt;br /&gt;    vX = velocityScaling * (x - lastX);&lt;br /&gt;    vY = velocityScaling * (y - lastY);&lt;br /&gt;    lastX = x;&lt;br /&gt;    lastY = y;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MalletC extends Disc {&lt;br /&gt;  function move(): Void {&lt;br /&gt;    x += vX;&lt;br /&gt;&lt;br /&gt;    if (x + radius &gt; 2 * goalCornerRadius + tableWidth / 2 &lt;br /&gt;        + goalWidth / 2) {&lt;br /&gt;      x = 2 * goalCornerRadius + tableWidth / 2 + goalWidth / 2 &lt;br /&gt;          - radius;&lt;br /&gt;      vX *= -1.0;&lt;br /&gt;    } else if (x - radius &amp;lt; tableWidth / 2 - goalWidth / 2) {&lt;br /&gt;      x = tableWidth / 2 - goalWidth / 2 + radius;&lt;br /&gt;      vX *= -1.0;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Score {&lt;br /&gt;  attribute scoreC: Integer = 0;      // Computer's score.&lt;br /&gt;  attribute scoreH: Integer = 0;      // Human's score.&lt;br /&gt;  &lt;br /&gt;  function judgeGoal(): Void {&lt;br /&gt;    if (puck.x &amp;lt; 0) {&lt;br /&gt;      if (puck.y &gt; 2 * goalCornerRadius + tableHeight) {&lt;br /&gt;        scoreC += 1;&lt;br /&gt;      } else if (puck.y &amp;lt; 0) {&lt;br /&gt;        scoreH += 1;&lt;br /&gt;      }&lt;br /&gt;      puck.y = goalCornerRadius + tableHeight / 2;&lt;br /&gt;      timingGenerator.stop();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class ScoreIndicator extends CustomNode {&lt;br /&gt;  attribute score: Integer = 0;&lt;br /&gt;  attribute x: Integer = 0;&lt;br /&gt;  attribute y: Integer = 0;&lt;br /&gt;  attribute width: Integer = 21;&lt;br /&gt;  attribute height: Integer = 18;&lt;br /&gt;  attribute fillColor: Color = Color.WHITE;&lt;br /&gt;  attribute borderColor: Color = Color.YELLOWGREEN;&lt;br /&gt;  attribute scoreTextColor: Color = Color.BLACK;&lt;br /&gt;&lt;br /&gt;  function create(): Node {&lt;br /&gt;    Group {&lt;br /&gt;      content: [&lt;br /&gt;        Rectangle {&lt;br /&gt;          x: x, y: y&lt;br /&gt;          width: width, height: height&lt;br /&gt;          arcWidth: 6, arcHeight: 6&lt;br /&gt;          stroke: borderColor, fill: fillColor&lt;br /&gt;          },&lt;br /&gt;        Text {&lt;br /&gt;          x: x + 4 * height / 18 as Integer&lt;br /&gt;          y: y + 5 * height / 18 as Integer&lt;br /&gt;          textOrigin: TextOrigin.TOP&lt;br /&gt;          fill: scoreTextColor&lt;br /&gt;          font: Font {&lt;br /&gt;            size: 14 * height / 18 as Integer &lt;br /&gt;            name: "Monospaced", style: FontStyle.BOLD&lt;br /&gt;          }&lt;br /&gt;          content: bind "{%2d score}"&lt;br /&gt;        }&lt;br /&gt;      ]&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-5416140302253169049?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/5416140302253169049/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=5416140302253169049' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5416140302253169049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5416140302253169049'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/10/javafxair-hockey-game.html' title='JavaFXで空中ホッケー遊技（Air hockey game）を作る'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_v58IVq86t4s/SOsWqNBPfXI/AAAAAAAAACs/bjfsuf6hvpM/s72-c/BlogSampleAirHockey.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4307824429761105193</id><published>2008-09-09T21:30:00.004+09:00</published><updated>2008-09-09T22:26:18.626+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>仕立て節がうまく機能しない</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;&lt;a href="http://terrasweblog.blogspot.com/2008/08/scada-uijavafx-sdkpac.html"&gt;前回の投稿&lt;/a&gt;で、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA UIプログラム例をPAC類型に基づいて構成しなおしました。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;そこで、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA &lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;UIの構成部品（数値指示計や棒図式指示計など）をjavafx.scene.CustomNodeクラスの派生クラスとしてPACエージェント化しようとしたのですが、どうもうまくいきません。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;CustomNodeの派生クラスで、新たに関数を定義しているのですが、&lt;/span&gt;その関数が思ったように機能してくれません。関数の機能を限定し、「回避策」的なプログラミングを行えば、少なくともこれまでご紹介した&lt;span style="font-family:lucida grande;"&gt;SCADA UIプログラム例&lt;/span&gt;と同程度の機能を持った&lt;span style="font-family:lucida grande;"&gt;仕立て節を作ることは可能です。ですが、せっかく「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;仕立てる」のですから、あらが目立つようではどうも…。というわけで、もう少し一括変換器の成熟を待つことにしました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX言語V1.0における変更点についても、これまでにご紹介したもの以外の変更があるのですが、すでにご紹介した内容についても更なる変更が生じていますので、こちらについても落ち着くのを待ってご紹介したほうが良さそうです。まだ「2008年の秋」は始まったばかりですから…。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4307824429761105193?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4307824429761105193/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4307824429761105193' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4307824429761105193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4307824429761105193'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/09/blog-post.html' title='仕立て節がうまく機能しない'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-9217331339181801920</id><published>2008-08-18T15:42:00.005+09:00</published><updated>2008-08-18T18:35:00.804+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><title type='text'>JavaFX言語V1.0における変更：利用修飾子</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;JavaFX言語のV1.0における変更点の内、利用修飾子について、その内容をご案内したいと思います。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;var&lt;/span&gt; x;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;var&lt;/span&gt; x : String;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;var&lt;/span&gt; x = z + 22;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;var&lt;/span&gt; x = bind f(q);&lt;br /&gt;変数を宣言します。変数は、オブジェクト直定数で初期化したり、派生クラスで再定義したり、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;その&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;値&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;を読んだり、値を割り当てたり、もしくは既定値の式またはオブジェクト直定数の初期化で結合することができます。既定で利用可能なのは台本内からで、利用修飾子がない場合は、同じ台本内からのみ初期化、再定義、読むこと、割り当て、または結合が可能です。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;def&lt;/span&gt; x = 100;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;def&lt;/span&gt; x = a + b;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;def&lt;/span&gt; x = bind a + b;&lt;br /&gt;変数を定義します。定義内容は変更できません。この種の変数は、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;オブジェクト直定数で初期化したり、派生クラスで再定義したり、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;値を割り当てたりすることができません。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;既定で利用可能なのは台本内からで、利用修飾子がない場合は、同じ台本内からのみ読むこと、または結合が可能です。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public var&lt;/span&gt; x;&lt;br /&gt;公開変数を宣言します。この変数は、どこからでも、初期化、再定義、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;読むこと&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;、割り当て、もしくは結合が可能です。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public def&lt;/span&gt; x = "Hi";&lt;br /&gt;公開変数を定義します。この定義は、どこからでも読むこと、および結合が可能ですが、値を割り当てたり、オブジェクト直定数で初期化したり、または派生クラスで再定義することはできません。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;protected var&lt;/span&gt; x;&lt;br /&gt;同じパッケージまたは派生クラスから利用可能な変数を宣言します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;protected def&lt;/span&gt; x = bind z;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;同じパッケージまたは派生クラスから読むこと、または結合が可能な変数を定義します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-weight: bold;"&gt;package var&lt;/span&gt; x;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;同じパッケージから利用可能な変数を宣言します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;package def&lt;/span&gt; x = 42;&lt;br /&gt;同じパッケージから読むこと、または結合が可能な変数を定義します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande; font-weight: bold;"&gt;public-readable var&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt; x;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;どこからでも読むことはできますが、既定で利用可能な台本内からのみ、初期化または書くこと（割り当てまたは結合）が可能な変数を宣言します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-weight: bold;"&gt;public-readable package var&lt;/span&gt; x;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;どこからでも読むことはできますが、同じパッケージ内からのみ初期化または書くこと（割り当てまたは結合）が可能な変数を宣言します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-weight: bold;"&gt;non-writable public var&lt;/span&gt; x = 1.0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-weight: bold;"&gt;non-writable public var&lt;/span&gt; x;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;公に利用できますが、書くこと&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;（割り当てまたは結合）&lt;span style="font-family: lucida grande;"&gt;ができない変数を宣言します。どこからでも、初期化、再定義、または読むことは可能ですが、その値を変更することはできません。この場合、初期化は書くことにはあたりません。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;non-writable var&lt;/span&gt; x = 1.0;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;同じ台本内から初期化または読むことはできますが、値の&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;割り当てまたは結合は&lt;span style="font-family: lucida grande;"&gt;できない変数を宣言します。&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-9217331339181801920?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/9217331339181801920/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=9217331339181801920' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/9217331339181801920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/9217331339181801920'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/08/javafxv10_18.html' title='JavaFX言語V1.0における変更：利用修飾子'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4247984809837595962</id><published>2008-08-17T16:51:00.003+09:00</published><updated>2008-08-18T15:52:54.467+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><title type='text'>JavaFX言語V1.0における変更</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;JavaFX言語のV1.0（初版）における変更点について、ご案内したいと思います。&lt;br /&gt;まだ実装されていないものもあります。また、実装済みのものについては、古い構文も（警告はされるが）ある期間は引き続き機能するようです。ただし、最終的には、警告ではなく誤りになり、その切り替わり時点は決まっていないということのようです。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;不等価演算子&lt;/span&gt;&lt;br /&gt;不等価演算子「&amp;lt;&gt;」は「!=」に置き換えられました。この件と次の剰余演算子の変更については、以前の&lt;a href="http://terrasweblog.blogspot.com/2008/08/javafx.html"&gt;投稿&lt;/a&gt;でも触れました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;剰余演算子&lt;/span&gt;&lt;br /&gt;剰余演算子「%」は「mod」に置き換えられました。これに関連して、剰余代入演算子「%=」は、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;mod=&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;」に置き換えられるのではなく）剰余代入演算子そのものが&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;支援されなくなるため、「x = x mod y」のように記述することになります。&lt;br /&gt;ちなみに、JavaFXの剰余演算はJavaのそれ（%）と同じで、剰余の符号は被除数の符号に合わせられます（被除数および／または除数が負数の場合の、剰余の符号に関係します）。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;台本の取込み&lt;/span&gt;&lt;br /&gt;import文は、Java言語の「import static」（J2SE 5.0で支援された、クラスの&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;静的要素の取り込み）機能を含むように、拡張されました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;「+」による文字列連結の廃止&lt;/span&gt;&lt;br /&gt;「+」演算子による文字列の連結は廃止されます。String型の変数aとbに格納した文字列の連結は、（「a + b」ではなく）「"{a}{b}"」と表します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;関数再定義&lt;/span&gt;&lt;br /&gt;クラスの要素関数を再定義するときは、「override」鍵語が必要になります。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;変数宣言&lt;/span&gt;&lt;br /&gt;変数を宣言するときは、それがどこであれ、鍵語「var」と「def」が使用され、鍵語「attribute」（クラス属性を宣言）と「static」（台本水準の変数を定義）はなくなります。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;def&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;」を用いて定義した変数に（初期化以外で）値を割り当てると誤りになります。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;利用修飾子&lt;/span&gt;&lt;br /&gt;利用修飾子は、「public」、「package」、「protected」、「public-readable」および「non-writable」の5つとなり、「private」はなくなります。既定の利用可能性は、「台本内から利用可」です。&lt;br /&gt;利用修飾子については、別途投稿します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;オブジェクト直定数構文&lt;/span&gt;&lt;br /&gt;「オブジェクト直定数の振る舞いがいくぶんか限定され、構文も厳密になる」ようです。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;再帰取込み&lt;/span&gt;&lt;br /&gt;「import パッケージ名.*」構文は、「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;import パッケージ名.**&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;」を支援するように拡張されます。これは、「指定されたパッケージとその下位パッケージに含まれるすべてを取り込む」ことを意味します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;仮引数の不変化&lt;/span&gt;&lt;br /&gt;関数の仮引数は不変で、それらに値を割り当てると誤りになります。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4247984809837595962?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4247984809837595962/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4247984809837595962' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4247984809837595962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4247984809837595962'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/08/javafxv10.html' title='JavaFX言語V1.0における変更'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-6362912848586897175</id><published>2008-08-14T17:26:00.007+09:00</published><updated>2008-08-17T21:22:54.927+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><title type='text'>SCADA UIプログラム例のJavaFX SDK対応書き換え：PAC類型適用</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;&lt;a href="http://terrasweblog.blogspot.com/2008/08/scada-uijavafx-sdk_03.html"&gt;先日の投稿&lt;/a&gt;で、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA UIプログラム例のJavaFX SDK対応の書き換えは、一応済みました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;今回は、プログラム構造を基本設計におけるPAC（Presentation-Abstraction-Control）類型を参考にして構成し直してみました。ただし、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Presentation要素&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;と&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Abstraction要素&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;が、結合機能により、（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Control要素&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を介さない）直接的なつながりを持っているので、純粋にはPAC類型と呼べないかも知れません。&lt;br /&gt;しかし、機能的なまとまりをPACエージェントとして構成し、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;全体をそれらPACエージェントの階層化された木構造で構成しているという点においては、PAC類型に準じたものです。PAC類型については、F. ブッシュマン、ほか著の『ソフトウェア アーキテクチャ ソフトウェア開発のためのパターン体系』（株式会社トッパン，1999）に説明されています。&lt;br /&gt;PACエージェントとして構成するため、Javaのプログラムを2つに分けました。&lt;br /&gt;まずは、依頼機側の接続エージェントとなるJavaのプログラムを示します。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;/*&lt;br /&gt;* ClientSideConnection.java&lt;br /&gt;* The Client-Side Connection agent for a SCADA application.&lt;br /&gt;*&lt;br /&gt;* Created and modified:&lt;br /&gt;* V 1.0.0    2008/07/31&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author terra&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;class ClientSideConnection {&lt;br /&gt;&lt;br /&gt;private int i = -1;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Create and return pseudo SCADA data as if received from a server.&lt;br /&gt;*/&lt;br /&gt;double receiveScadaData() {&lt;br /&gt;  i += 1;&lt;br /&gt;  if (i &gt;= 360) {&lt;br /&gt;    i = 0;&lt;br /&gt;  }&lt;br /&gt;  return (double) Math.sin(i * Math.PI / 180) * 100;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Main method for testing this class.&lt;br /&gt; *&lt;br /&gt; * @param args the command line arguments&lt;br /&gt; */&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;  ClientSideConnection scc = new ClientSideConnection();&lt;br /&gt;&lt;br /&gt;  for (int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;    System.out.println(scc.receiveScadaData());&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次に、警報鳴動エージェントとなる&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Javaのプログラムを示します。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;/*&lt;br /&gt;* AlarmSounder.java&lt;br /&gt;* The Temporary Alarm Sounder agent for a SCADA application.&lt;br /&gt;* At some point, this agent will be rewritten in the JavaFX language.&lt;br /&gt;*&lt;br /&gt;* Created and modified:&lt;br /&gt;* V 1.0.0    2008/08/11&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import java.applet.Applet;&lt;br /&gt;import java.applet.AudioClip;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author terra&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;class AlarmSounder {&lt;br /&gt;&lt;br /&gt;private AudioClip ac = Applet.newAudioClip(&lt;br /&gt;    AlarmSounder.class.getResource("ALERT.WAV"));&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Start sounding the alarm.&lt;br /&gt; */&lt;br /&gt;public void startAlarm() {&lt;br /&gt;  ac.loop();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Stop sounding the alarm.&lt;br /&gt; */&lt;br /&gt;public void stopAlarm() {&lt;br /&gt;  ac.stop();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Main method for testing this class.&lt;br /&gt; *&lt;br /&gt; * @param args the command line arguments&lt;br /&gt; */&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;  AlarmSounder as = new AlarmSounder();&lt;br /&gt;&lt;br /&gt;  as.startAlarm();&lt;br /&gt;  JOptionPane.showMessageDialog(null, "Alarm is sounding！",&lt;br /&gt;      "Alarm test", JOptionPane.WARNING_MESSAGE);&lt;br /&gt;  as.stopAlarm();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最後に、利用者インタフェース（UI）最上位エージェントである、UI枠付き窓エージェントのJavaFXプログラムを示します。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;/*&lt;br /&gt;* ScadaClientUI.fx&lt;br /&gt;* The User Interface Frame (UIF) agent for a SCADA application.&lt;br /&gt;*&lt;br /&gt;* Created and modified:&lt;br /&gt;* V 1.0.0    2008/08/01&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.application.*;&lt;br /&gt;import javafx.input.*;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.geometry.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author terra&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;var csc = new ClientSideConnection();   // Client-Side Connection agent.&lt;br /&gt;var alarmSounder = new AlarmSounder();  // Alarm Sounder agent.&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* The Abstraction compenent of the UIF agent.&lt;br /&gt;*/&lt;br /&gt;class UIFAbstraction {&lt;br /&gt;attribute numericDatum: Number;&lt;br /&gt;attribute numericData: Number[] = for (i in [0..180]) 0.0;&lt;br /&gt;attribute alarting: Boolean;&lt;br /&gt;function getDisplayColor(value: Number): Color {&lt;br /&gt;  var c: Color = Color.GREEN;&lt;br /&gt;  if (value &gt; 90.0) {&lt;br /&gt;    c = Color.RED;&lt;br /&gt;  } else if (value &gt; 75.0) {&lt;br /&gt;    c = Color.color(1.0, 0.6, 0.0);&lt;br /&gt;  }&lt;br /&gt;  return c;&lt;br /&gt;}&lt;br /&gt;function setNumericDatum(value: Number): Void {&lt;br /&gt;  numericDatum = value;&lt;br /&gt;  delete numericData[0];&lt;br /&gt;  insert value into numericData;&lt;br /&gt;  if (numericDatum &gt; 90.0 and not alarting) {&lt;br /&gt;    alarting = true;&lt;br /&gt;    alarmSounder.startAlarm();&lt;br /&gt;    alarmDialog.toFront();&lt;br /&gt;    alarmDialog.visible = true;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;function setAlarting(alarting: Boolean): Void {&lt;br /&gt;  this.alarting = alarting;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;var uifa = UIFAbstraction {};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* The Control compenent of the UIF agent.&lt;br /&gt;*/&lt;br /&gt;class UIFControl {&lt;br /&gt;attribute schedular: Timeline = Timeline{&lt;br /&gt;  repeatCount: Timeline.INDEFINITE&lt;br /&gt;  keyFrames: KeyFrame {&lt;br /&gt;    time: 200ms&lt;br /&gt;    action: function(): Void {&lt;br /&gt;      uifa.setNumericDatum(csc.receiveScadaData());&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;var uifc = UIFControl {};&lt;br /&gt;uifc.schedular.start();&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* The Presentation compenent of the UIF agent.&lt;br /&gt;*/&lt;br /&gt;Frame {&lt;br /&gt;title: "SCADA UI Example"&lt;br /&gt;width: 800, height: 632&lt;br /&gt;visible: true&lt;br /&gt;closeAction: function(): Void {System.exit(0);}&lt;br /&gt;stage: Stage {&lt;br /&gt;  width: 800, height: 600&lt;br /&gt;  fill: Color.color(0.9, 0.9, 0.9)&lt;br /&gt;  content: [&lt;br /&gt;    Group {&lt;br /&gt;      translateX: 50, translateY: 50&lt;br /&gt;      content: [&lt;br /&gt;        Rectangle {&lt;br /&gt;          width: 55, height: 18&lt;br /&gt;          arcWidth: 4, arcHeight: 4&lt;br /&gt;          stroke: Color.BLUE, fill: Color.WHITE&lt;br /&gt;          },&lt;br /&gt;        Text {&lt;br /&gt;          x: 4, y: 5&lt;br /&gt;          textOrigin: TextOrigin.TOP&lt;br /&gt;          fill: bind uifa.getDisplayColor(uifa.numericDatum)&lt;br /&gt;          font: Font {&lt;br /&gt;            name: "Monospaced", size: 14, style: FontStyle.PLAIN&lt;br /&gt;          }&lt;br /&gt;          content: bind "{%7.2f uifa.numericDatum}"&lt;br /&gt;        },&lt;br /&gt;        Text {&lt;br /&gt;          x: 60, y: 6&lt;br /&gt;          textOrigin: TextOrigin.TOP&lt;br /&gt;          font: Font {&lt;br /&gt;            name: "Monospaced", size: 14, style: FontStyle.PLAIN&lt;br /&gt;          }&lt;br /&gt;          content: "m3/s"&lt;br /&gt;        }&lt;br /&gt;      ]&lt;br /&gt;    },&lt;br /&gt;    Group {&lt;br /&gt;      translateX: 200, translateY: 50&lt;br /&gt;      content: [&lt;br /&gt;        Rectangle {&lt;br /&gt;          width: 60, height: 120&lt;br /&gt;          stroke: Color.BLUE, fill: Color.WHITE&lt;br /&gt;        },&lt;br /&gt;        Rectangle {&lt;br /&gt;          x: 10, y: 10&lt;br /&gt;          width: 10, height: 100&lt;br /&gt;          fill: LinearGradient {&lt;br /&gt;            startX: 0.0, startY: 0.0&lt;br /&gt;            endX: 0.0, endY: 1.0&lt;br /&gt;            stops: [&lt;br /&gt;              Stop {offset: 0.05, color: Color.RED},&lt;br /&gt;              Stop {offset: 0.0875, color: Color.color(1.0, 0.6, 0.0)},&lt;br /&gt;              Stop {offset: 0.125, color: Color.LIMEGREEN},&lt;br /&gt;            ]&lt;br /&gt;          }&lt;br /&gt;        },&lt;br /&gt;        Rectangle {&lt;br /&gt;          x: 10, y: 10&lt;br /&gt;          width: 10, height: bind 50 - uifa.numericDatum / 2&lt;br /&gt;          fill: Color.BLACK&lt;br /&gt;        },&lt;br /&gt;        Line {&lt;br /&gt;          startX: 23, startY: 10&lt;br /&gt;          endX: 23, endY: 110&lt;br /&gt;          stroke: Color.BLACK&lt;br /&gt;        },&lt;br /&gt;        Group {&lt;br /&gt;          translateX: 23, translateY: 10&lt;br /&gt;          content: for (i in [-100..100 step 50]) Line {&lt;br /&gt;            translateY: i / 2 + 50&lt;br /&gt;            startX: 0, startY: 0&lt;br /&gt;            endX: 3, endY: 0&lt;br /&gt;            stroke: Color.BLACK&lt;br /&gt;          }&lt;br /&gt;        },&lt;br /&gt;        Group {&lt;br /&gt;          translateX: 32, translateY: 10&lt;br /&gt;          content: for (i in [-100..100 step 50]) Text {&lt;br /&gt;            translateY: 53 - i / 2&lt;br /&gt;            content: "{i}"&lt;br /&gt;            font: Font {&lt;br /&gt;              name: "Monospaced", size: 10, style: FontStyle.PLAIN&lt;br /&gt;            }&lt;br /&gt;            horizontalAlignment: HorizontalAlignment.LEADING&lt;br /&gt;            verticalAlignment: VerticalAlignment.TOP&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      ]&lt;br /&gt;    },&lt;br /&gt;    Group {&lt;br /&gt;      translateX: 50, translateY: 200&lt;br /&gt;      content: [&lt;br /&gt;        Rectangle {&lt;br /&gt;          width: 230, height: 120&lt;br /&gt;          stroke: Color.BLUE, fill: Color.WHITE&lt;br /&gt;        },&lt;br /&gt;        Rectangle {&lt;br /&gt;          x: 10, y: 22&lt;br /&gt;          width: 181, height: 88&lt;br /&gt;          fill: Color.BLACK&lt;br /&gt;        },&lt;br /&gt;        Rectangle {&lt;br /&gt;          x: 10, y: 15&lt;br /&gt;          width: 181, height: 7&lt;br /&gt;          fill: Color.GRAY&lt;br /&gt;        },&lt;br /&gt;        Rectangle {&lt;br /&gt;          x: 10, y: 10&lt;br /&gt;          width: 181, height: 5&lt;br /&gt;          fill: Color.DARKGRAY&lt;br /&gt;        },&lt;br /&gt;        Line {&lt;br /&gt;          startX: 194, startY: 10&lt;br /&gt;          endX: 194, endY: 110&lt;br /&gt;          stroke: Color.BLACK&lt;br /&gt;        },&lt;br /&gt;        Group {&lt;br /&gt;          translateX: 194, translateY: 10&lt;br /&gt;          content: for (i in [-100..100 step 50]) Line {&lt;br /&gt;            translateY: i / 2 + 50&lt;br /&gt;            startX: 0, startY: 0&lt;br /&gt;            endX: 3, endY: 0&lt;br /&gt;            stroke: Color.BLACK&lt;br /&gt;          }&lt;br /&gt;        },&lt;br /&gt;        Group {&lt;br /&gt;          translateX: 203, translateY: 11&lt;br /&gt;          content: for (i in [-100..100 step 50]) Text {&lt;br /&gt;            translateY: 53 - i / 2&lt;br /&gt;            content: "{i}"&lt;br /&gt;            font: Font {&lt;br /&gt;              name: "Monospaced", size: 10, style: FontStyle.PLAIN&lt;br /&gt;            }&lt;br /&gt;            horizontalAlignment: HorizontalAlignment.LEADING&lt;br /&gt;            verticalAlignment: VerticalAlignment.TOP&lt;br /&gt;          }&lt;br /&gt;        },&lt;br /&gt;        Group {&lt;br /&gt;          translateX: 10, translateY: 10&lt;br /&gt;          content: for (i in [0..179]) Line {&lt;br /&gt;            translateX: i&lt;br /&gt;            startX: 0, startY: bind 50 - uifa.numericData[i] / 2&lt;br /&gt;            endX: 1, endY: bind 50 - uifa.numericData[i + 1] / 2&lt;br /&gt;            strokeWidth: 2&lt;br /&gt;            stroke: bind uifa.getDisplayColor(uifa.numericData[i + 1])&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      ]&lt;br /&gt;    }&lt;br /&gt;  ]&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* The Alarm Dialog agent.&lt;br /&gt;*/&lt;br /&gt;var alarmDialog = Dialog {&lt;br /&gt;title: "Alarm"&lt;br /&gt;width: 300, height: 60&lt;br /&gt;visible: false&lt;br /&gt;closeAction: function(): Void {&lt;br /&gt;  alarmSounder.stopAlarm();&lt;br /&gt;  uifa.alarting = false;&lt;br /&gt;}&lt;br /&gt;stage: Stage {&lt;br /&gt;  content: Text {&lt;br /&gt;    x: 10, y: 10&lt;br /&gt;    textOrigin: TextOrigin.TOP&lt;br /&gt;    fill: Color.RED&lt;br /&gt;    font: Font {size: 14}&lt;br /&gt;    content: "Flow rate exceeded the second upper limit!"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-6362912848586897175?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/6362912848586897175/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=6362912848586897175' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6362912848586897175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6362912848586897175'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/08/scada-uijavafx-sdkpac.html' title='SCADA UIプログラム例のJavaFX SDK対応書き換え：PAC類型適用'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-2990963643543021283</id><published>2008-08-10T15:56:00.009+09:00</published><updated>2008-08-11T10:55:26.151+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='個人用計算機徒然草'/><title type='text'>第一段 デフラグをする前に</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;Windowsをお使いの皆さん、「ディスク デフラグ」はどうされていますか。&lt;br /&gt;私はWindows ＸＰを使っていますが、以前は、毎週定期的に磁気円盤上のファイルの控えをとった後に、そのままデフラグを行っていました。&lt;br /&gt;しかし、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;磁気円盤上に情報が正常に読み書きできない部分がある状態でデフラグを行うと、最悪の場合、Windows自体が損傷を受け、個人用計算機が立ち上がらなくなってしまうことがあるようです。&lt;br /&gt;Windows 98では、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;磁気円盤上の情報の読み書きで誤りを検出すると、デフラグの途中で「スキャン ディスクを行え」というような窓が表示され、デフラグが中断したように記憶していました。それで、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;磁気円盤&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の誤り検査を行わずに、いきなりデフラグを行っていたのですが、これが危険なことのようなのです。実際、私は痛い目にあってしまいました。&lt;br /&gt;それ以来、デフラグを行う前には、磁気円盤の「エラー チェック」を行うようにしています（「そんなことは、常識だろ」といわれそうですが。なお、「エラー チェック」の方法をお知りになりたい場合は、「スタート」ボタンを押して表示される機能選択肢の「ヘルプとサポート」で検索してみてください）。私は、誤り検査だけしか行わない（修復や回復は行わない）ので、それほど時間はかかりません（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;修復や回復を行うように選択すると、駆動機構によっては&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Windowsを再起動する必要があります。再起動が必要ない駆動機構の場合でも、検査だけよりかなり時間がかかります）。&lt;br /&gt;私にとっては、「そういうことは、早く教えてよ～」なことでした。「何事も先達はあらまほし…」といいますので、私の轍を踏むことのないようにと、老婆心ながら投稿しました（もっとも、誤り検出を行って正常なことを確認した上でデフラグを行えば安全だ、という保証があるわけではないのですが）。&lt;br /&gt;なお、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（私は経験していませんが、）&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「エラー チェック」で異常を検出すると、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;修復と回復を選択して、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「エラー チェック」をし直すよう促す窓が表示されるようです。また、そもそもデフラグはあまり頻繁に行わないほうがよいと書かれているWebページもあります（頻繁に行ってもあまり効果がないとか、磁気円盤記憶装置の寿命を縮めるというのもありました。本当のところはどうなのでしょうか）。私は、分析の結果デフラグを行う必要がないと表示されたときは、デフラグを行わないようにしています（以前は、必要がないといわれてもデフラグを行っていましたが…）。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-2990963643543021283?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/2990963643543021283/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=2990963643543021283' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2990963643543021283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2990963643543021283'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/08/blog-post.html' title='第一段 デフラグをする前に'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1576500451828003512</id><published>2008-08-07T21:04:00.014+09:00</published><updated>2008-08-10T21:27:25.907+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：改訂版</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;以前に和訳を&lt;a href="http://terrasweblog.blogspot.com/2008/06/javafx1.html"&gt;投稿&lt;/a&gt;した「&lt;/span&gt;&lt;a href="http://openjfx.java.sun.com/current-build/doc/reference/JavaFX-Language.html"&gt;&lt;span style="font-family:lucida grande;"&gt;The JavaFX™ Script Programming Language Reference  (Draft)&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;」が改訂されましたので、訳の方も改めました。改訂内容としては、単に記述項目を追加しただけでなく、以前の記述内容や表現の見直しも行われています。&lt;br /&gt;-------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;JavaFX台本型プログラミング言語基準（草案）&lt;br /&gt;&lt;br /&gt;目次&lt;br /&gt;1.言語概要&lt;br /&gt;2. クラスとオブジェクト&lt;br /&gt;3.属性と関数&lt;br /&gt;4.変数と基本データ型&lt;br /&gt;5.式と演算子&lt;br /&gt;6.列を宣言する&lt;br /&gt;7.列を利用する&lt;br /&gt;8.データ結合&lt;br /&gt;9.引き金&lt;br /&gt;10.動画&lt;br /&gt;A.鍵語と予約語&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.言語概要&lt;br /&gt;この章では、JavaFX™台本型プログラミング言語（訳注：以下、「JavaFX言語」と略記）の概要について説明する。ここでは、このプログラミング言語の主な特徴を高い水準で述べ、特定の構成概念についての詳述は後の章で行う。この本は、ウェブ（Web）ページにおいて、Java™ Web Startソフトウェアとしてまたは従来型の机上応用プログラムとして実行される、表現力豊かなインタネット依頼機応用プログラムや要素の、設計者および開発者を対象としたものである。読者がJavaScriptまたはJava™プログラミング言語（訳注：以下、「Java言語」と略記）のいずれか、または両者に精通していることを想定している。この文書は公式な言語仕様を定めたものではないが、現在支援されている言語の特徴のすべてに対する完全な基準とみなすことができる。&lt;br /&gt;JavaFX言語は、次の特徴を有している。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   ・図式利用者インタフェース（GUI）構成部品の指定に宣言型構文を&lt;br /&gt;     使用しており、開発者のプログラムコードをGUIの実際の配置に&lt;br /&gt;     ぴたりと対応させることを可能にしている。&lt;br /&gt;   ・宣言型データ結合と増分評価を使用しており、個々の構成部品を&lt;br /&gt;     容易に作成および構成することを可能にしている。応用プログラムの&lt;br /&gt;     データとGUIの構成部品は、自動的に同期がとられる。&lt;br /&gt;   ・静的に型付けされており、Java言語において大規模プログラムの&lt;br /&gt;     作成と保守を可能にしているのと同様のコード構造、再利用および&lt;br /&gt;     情報隠ぺいなどの特性のほとんどを有している。&lt;br /&gt;   ・どのような規模または複雑さのGUIも支援することができる。&lt;br /&gt;   ・Swingの利用を容易にする。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以下の節では、JavaFX言語について駆け足で紹介する。しかるべき点についてはJava言語と比較および対比させながら、その核となる構文と機能についての一般的な導入を与える。そして、それぞれの主題は後の章で更に詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;台本&lt;br /&gt;JavaFX言語において、「台本」は1つ以上の宣言または式である。台本を評価することは、宣言または式を順序を追って評価することである。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var ten : Integer = 10;&lt;br /&gt;   java.lang.System.out.println("Twice {ten} is {2 * ten}.");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これは、次のように表示する。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   Twice 10 is 20.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Java言語で書かれた応用プログラムと異なり、台本は、いかなるクラス宣言または関数も含む必要がない。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;クラス&lt;br /&gt;クラスの定義は、Java言語と多くの共通点を持っているが、いくつかの相違点は注目に値する。たとえば、情報は、領域ではなく、属性に格納される。振る舞いは、操作ではなく、関数によってあらわにされる。次の例は、それぞれの基本構文を示す単純な矩形クラスを定義している。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   class Rectangle {&lt;br /&gt;&lt;br /&gt;       attribute width: Integer;&lt;br /&gt;       attribute height: Integer;&lt;br /&gt;&lt;br /&gt;       function grow(): Void {&lt;br /&gt;           grow(1);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function grow(amount: Integer): Void {&lt;br /&gt;           width += amount;&lt;br /&gt;           height += amount;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;JavaFX言語は多重継承を支援しており、必要なら複数のクラスを継承することができる。&lt;br /&gt;クラスは、第2章で詳しく取り上げられる。&lt;br /&gt;属性と関数は、第3章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;オブジェクト&lt;br /&gt;オブジェクト直定数は、クラスの実体化のための簡便な構文を提供する。次のコードは、前述した矩形クラスの単一の実体を生成し、その幅と高さの属性を100に初期化する（newを必要としない点に留意すること）。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   Rectangle {&lt;br /&gt;&lt;br /&gt;       width: 100&lt;br /&gt;       height: 100&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;このオブジェクトへの参照を格納するには、var鍵語を使う。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var myRect = Rectangle {&lt;br /&gt;&lt;br /&gt;       width: 100&lt;br /&gt;       height: 100&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;オブジェクトは、第2章で詳しく取り上げられる。&lt;br /&gt;変数と基本データ型は、第4章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;式と演算子&lt;br /&gt;他のプログラミング言語と同様に、JavaFX言語は、式と演算子を支援する。&lt;br /&gt;第5章は、JavaFX言語において利用可能な式と演算子について論じる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;列&lt;br /&gt;列は、オブジェクトの順序付けられた一覧を保持する。これは、Java言語の配列にほぼ類似している。両方とも複数の値を保持し、0から始まる索引により検索される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var week = ["Monday","Tuesday","Wednesday","Thursday",&lt;br /&gt;           "Friday","Saturday","Sunday"];&lt;br /&gt;   var mon = week[0];&lt;br /&gt;   var wed = week[2];&lt;br /&gt;   var fri = week[4];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;部分列も支援されている。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var week = ["Monday","Tuesday","Wednesday","Thursday",&lt;br /&gt;           "Friday","Saturday","Sunday"];&lt;br /&gt;   var weekdays = week[0..4]; // 第1部分列&lt;br /&gt;   var weekend = week[5..6]; // 第2部分列&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;第6章は列の宣言の基本を取り上げており、一方、第7章は列の利用に焦点を当てている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;データ結合&lt;br /&gt;データ結合は、複数オブジェクトの状態を同期させるための簡便な構文を提供する。2つのオブジェクトが互いに結合されると、1番目のオブジェクトが更新されたときはいつも2番目のオブジェクトの値が自動的に変更される。データ結合の一般的な利用法は、GUI部品をその基となるデータに同期させ続けることである。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import javafx.application.Frame;&lt;br /&gt;   import javafx.application.Stage;&lt;br /&gt;   import javafx.scene.text.Text;&lt;br /&gt;&lt;br /&gt;   var myString = "Hello World!";&lt;br /&gt;&lt;br /&gt;   Frame {&lt;br /&gt;       width: 50&lt;br /&gt;       height: 50&lt;br /&gt;       visible: true&lt;br /&gt;       stage: Stage {&lt;br /&gt;           content: Text {&lt;br /&gt;               content: bind myString&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // コードのほかの部分でmyStringを変更すると、&lt;br /&gt;   // GUIの文字列も自動的に変更される。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;データ結合は、第8章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;引き金&lt;br /&gt;引き金は、ある条件が満たされると実行されるコードの区画である。たとえば、ある属性の値が不適切なものに設定された場合には、注意を喚起してほしいと思うかもしれない。次の例は、その基本的な引き金の構文を示す。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   ReplaceDemo {&lt;br /&gt;&lt;br /&gt;       mySensitiveData: "Will anyone notice?"&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   class ReplaceDemo {&lt;br /&gt;       attribute mySensitiveData: String&lt;br /&gt;           on replace {&lt;br /&gt;               System.out.println("I noticed a change!");&lt;br /&gt;           };&lt;br /&gt;&lt;br /&gt;           // 応用特有の保護手段コードがここに書かれる&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;引き金は、第9章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.クラスとオブジェクト&lt;br /&gt;&lt;br /&gt;クラスを取り込む&lt;br /&gt;取り込み文は、Java言語と同様に機能する。その構文は、&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import パッケージ名.クラス名;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;および&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import パッケージ名.*;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;である。&lt;br /&gt;取り込み文が存在する場合は、それ以外のすべての応用コードの前になければならない。JavaFX言語は、自身の組み込みライブラリクラスのための名前空間（パッケージjavafx.*）を定義しているが、標準的なJava言語のクラスを取り込むこともできる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import javafx.application.*;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;クラスを定義する&lt;br /&gt;クラスを指定するための構文は、class鍵語に続けたクラス名、任意選択としてのextends鍵語とカンマで区切った基底クラス名の一覧、左中括弧、それぞれセミコロンで終結している属性と関数の一覧、および右中括弧からなる。&lt;br /&gt;JavaFX言語は多重継承を支援しており、そうしたものとして、新たな用語と規定を定義している。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   ・単純クラスは、Java言語で書かれたクラスを直接的または間接的に&lt;br /&gt;      拡張した任意のクラスである。&lt;br /&gt;   ・複合クラスは、単純クラスに当てはまらないすべてのクラスである。&lt;br /&gt;   ・既定では、JavaFX言語で書かれたクラスは複合クラスである。&lt;br /&gt;   ・クラスは、1つの単純クラスだけを拡張することができる。&lt;br /&gt;     そうしたクラスは、単純クラスとなる。クラスはまた、任意の数の&lt;br /&gt;     複合クラスまたはJava言語のインタフェースを拡張することもできる。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;注記：現在のところ、単純クラスはJavaクラスに変換され、一方、複合クラスはJavaクラスとJavaインタフェースに変換される。&lt;br /&gt;&lt;br /&gt;クラスはpublicと宣言することができ、それは、そのクラスが台本のどこからでも利用できることを意味する。さもなければ、そのクラスを含んでいる台本からのみ利用できる（これが既定）。&lt;br /&gt;JavaFX言語は構築子を支援していない。その代わりに、オブジェクト直定数を使用しなければならない。構築子の作用をまねるためには、新たなオブジェクトを返す関数を定義し、その関数を呼び出す。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;オブジェクトを定義する&lt;br /&gt;前の章で述べたように、クラス実体化の推奨方法はオブジェクト直定数を使うことである。この形式のオブジェクト割り当ては、クラス名とその後に続く中括弧でくくった属性初期化子の一覧から構成される宣言的構文を用いる。それぞれの初期化子は、属性名に、コロンとその属性の値を定義する式を続けて構成する。しかしながら、オブジェクトを生成する際にnew鍵語を使うこともできる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.io.File;&lt;br /&gt;&lt;br /&gt;   var tmpPath = "/home/users/docs/tmp.txt"&lt;br /&gt;   var myFile = new File("tmp.txt");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.属性と関数&lt;br /&gt;&lt;br /&gt;属性&lt;br /&gt;属性はオブジェクトの状態を定める。それらは、attribute鍵語に、属性名、コロン（任意選択）、属性の型（任意選択）を続け、セミコロンで終結させたものを用いて宣言される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   attribute 属性名 : 属性型  ;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;属性の既定値を宣言することができる（後で、オブジェクト直定数で規定される値に定義しなおすことができる）。初期化子は、新たに生成されるオブジェクトの状況に即して、クラス宣言内で属性が指定された順に評価される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   class X {&lt;br /&gt;       attribute a: Number = 10;&lt;br /&gt;       attribute b: Number = -1;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var x = X { };&lt;br /&gt;   System.out.println(x.a); // 10.0を表示する&lt;br /&gt;   System.out.println(x.b); // -1.0を表示する&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;明示的な初期化が行われないと、それぞれの属性は妥当な既定値に設定される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   class DefaultValuesDemo {&lt;br /&gt;       attribute a: Number;&lt;br /&gt;       attribute b: Integer;&lt;br /&gt;       attribute c: Boolean;&lt;br /&gt;       attribute d: String;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var demo = DefaultValuesDemo {};&lt;br /&gt;   System.out.println("Default Value: " + demo.a);&lt;br /&gt;   System.out.println("Default Value: " + demo.b);&lt;br /&gt;   System.out.println("Default Value: " + demo.c);&lt;br /&gt;   System.out.println("Default Value: " + demo.d);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記コードは、次の既定値を画面に表示する（注記：最後の行は、空文字列を表示する）。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   Default Value: 0.0&lt;br /&gt;   Default Value: 0&lt;br /&gt;   Default Value: false&lt;br /&gt;   Default Value:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;データ型は、第4章で取り上げられている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;関数&lt;br /&gt;関数はオブジェクトの振る舞いを定める。関数は次の形式を取る。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   function 関数名 (属性名 : 属性型, ...): 戻り型 本体&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ここで、本体は任意の式でかまわない。&lt;br /&gt;関数は第一級オブジェクトである（たとえば、変数に割り当てたり、引数としてほかの関数へ渡すことができる）。&lt;br /&gt;第1章で、何も引数を取らず、そして何も値を返さないgrow関数を定義している簡単な例を示した。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;br /&gt;   function grow(): Void {&lt;br /&gt;       grow(1);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;その例証では、利用者が特定の寸法を指定できるようにした、関数の多重定義版も与えた。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;br /&gt;   function grow(amount: Integer): Void {&lt;br /&gt;       width += amount;&lt;br /&gt;       height += amount;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;関数は、無名関数にもなりうる。無名関数は、GUI構成部品のaction属性に振る舞いを割り当てる際に、しばしば利用される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   // GUIにおいて&lt;br /&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;br /&gt;   action: function() {&lt;br /&gt;       System.out.println("Click!");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.変数と基本データ型&lt;br /&gt;&lt;br /&gt;変数&lt;br /&gt;第1章で論じたように、var鍵語は、新たな変数をプログラムに導入するために用いられる。変数の型は、それを宣言する際に指定してもよいが、指定は任意選択である。宣言から変数の型が省略されると、その型は変数の用いられ方からを推測することができる。&lt;br /&gt;変数宣言は、次の形式を取る。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var 変数名 : 型 = 初期化子;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;例：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var num = 1; // 推測された型&lt;br /&gt;   var num : Number = 2;&lt;br /&gt;   var firstName = "John"; // 推測された型&lt;br /&gt;   var lastName : String = "Doe";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;変数の命名法の慣例は、Java言語における慣例と同一である。クラス名は、各単語の最初の文字を大文字にする（MyClass）。関数名は小文字で始まるが、後に続く各単語の最初の文字は大文字にする（myFunctionName）。定数は、下線文字で区切られた単語により、すべて大文字で表されなければならない（MY_CONSTANT）。&lt;br /&gt;二重山括弧&amp;lt;&amp;lt;&gt;&gt;で閉じられた（空白文字を含む）いかなる文字列も、識別子として扱われる。これにより、JavaFX言語の鍵語（または、ほかの通常では不正な識別子）を、クラス、変数、関数、または属性の名前として用いることができる。&lt;br /&gt;例：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var &amp;lt;&amp;lt;delete&gt;&gt; = 100;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;また、JavaFX言語の鍵語と同じ名前の（Java言語で書かれた）操作を呼び出すこともできる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import javax.swing.JTextArea;&lt;br /&gt;&lt;br /&gt;   var textArea = new JTextArea();&lt;br /&gt;   textArea.&amp;lt;&amp;lt;insert&gt;&gt;("Hello", 0);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;変数の存続期間は、少なくとも、それを含むコード区画の存続期間と同じである。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;基本データ型&lt;br /&gt;JavaFX言語では、原始型（プリミティブ型）という用語は使わない。代わりに、5つの基本データ型を定義しており、応用コードで常に利用することができる。&lt;br /&gt;5つの基本データ型は、次のようにJava言語に対応付けられる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;               表 4.1  基本データ型&lt;br /&gt;   JavaFX言語                      Java言語&lt;br /&gt;   String                          java.lang.String&lt;br /&gt;   Boolean                         java.lang.Boolean&lt;br /&gt;   Number                          java.lang.Number&lt;br /&gt;   Integer                         byte,short,int,long,BigInteger&lt;br /&gt;   Duration                        該当なし&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最初の4つのデータ型は、Java言語でもしばしば使われるので、ほとんどの開発者には既になじみのあるものであろう。しかし、Duration型はこれまでになく、JavaFX言語に特有のものである。javafx.lang.Durationクラスは、時間の単位（ミリ秒、秒、分、または時間）を表す。Durationクラスを実体化するための簡略表現である、時間直定数も支援している。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   5ms; // 5ミリ秒&lt;br /&gt;   10s; // 10秒&lt;br /&gt;   30m; // 30分&lt;br /&gt;   1h;  // 1時間&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;整数を表す型については、引数または戻り値をJava言語で書かれた操作と受け渡しするときに、自動的に強制型変換が行われる。&lt;br /&gt;文字列に関しては、一重引用符または二重引用符のいずれかを用いて文字列直定数を指定することができる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var s1 = 'Hello';&lt;br /&gt;   var s2 = "Hello";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;一重引用符と二重引用符は対称性を持っている。一重引用符を二重引用符の中に埋め込むことができるし、二重引用符を一重引用符の中に埋め込むこともできる。どちらにも、中括弧「{}」を用いて式を埋め込むことができる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var name = 'Joe';&lt;br /&gt;   var s = "Hello {name}"; // s = 'Hello Joe'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;埋め込まれた式自体が引用符で囲まれた文字列を含むことができるので、次々に、さらなる埋め込み式を含むことができる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var answer = true;&lt;br /&gt;   var s = "The answer is {if (answer) "Yes" else "No"}";&lt;br /&gt;           // s = 'The answer is Yes'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Java言語と異なり、JavaFX言語の文字列直定数は、改行文字を含むことができる。&lt;br /&gt;文字列式に付加的な書式設定接頭辞を与えることにより、数値と日付をどのように文字列に変換するかについても制御することができる。この付加的な書式設定接頭辞は、java.util.Formatterの仕様に従う。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.util.Date;&lt;br /&gt;&lt;br /&gt;   var hexStr = "hex of 13 is 0x{%02X 13}";&lt;br /&gt;   // hexStr = "hex of 13 is 0x0D"       &lt;br /&gt;   var date = new Date(107, 10, 11);&lt;br /&gt;   var dateStr = "{%tc date}"; &lt;br /&gt;   // dateStr = "日 11 11 00:00:00 JST 2007"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;訳注：原文では、「var dateStr = "{%tc date}";」文末のセミコロン（;）が抜け落ちている。また、日本では、日付は上記コメントの書式で表示される。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5.式と演算子&lt;br /&gt;&lt;br /&gt;式&lt;br /&gt;Java言語と異なり、JavaFX言語は式言語である。すべての実行文は、0個以上の入力とそれに続く0個（または1個）の出力から構成される式である。これには、条件、繰り返し、およびコード区画も含まれる。&lt;br /&gt;次に実例を示す。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.Math;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   var rand = (Math.random() * 100).intValue();&lt;br /&gt;   var s:String = null;&lt;br /&gt;   if (rand mod 2 == 0) {&lt;br /&gt;       s = "rand is even"&lt;br /&gt;   } else {&lt;br /&gt;       s = "rand is odd"&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   System.out.println(s);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;訳注：原文では、剰余演算子として「%」を使用しているが、表 5.1に載っているように、これは「mod」に変わっている。したがって、上記のコード例もmodで書き換えている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;区画式&lt;br /&gt;区画式は、中括弧で囲まれた、セミコロン区切り文（宣言または式でもよい）の羅列から構成される。（区画内の）最後の文が式なら、その式の値が区画式の値となる。さもなければ、区画式はvoid型となる。&lt;br /&gt;次の区画式は、数個の数を加え、その結果をtotalという名前の変数に格納する。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   var nums = [5, 7, 3, 9];&lt;br /&gt;   var total = {&lt;br /&gt;       var sum = 0;&lt;br /&gt;       for (a in nums) { sum += a };&lt;br /&gt;       sum;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   System.out.println("Total is {total} ");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;値域式&lt;br /&gt;値域式は、次の構文により、等差数列を形成している数値の列を定める。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   [数1..数2]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記の式は、数1から数2までの整数（両端含む）からなる列を定める。&lt;br /&gt;値域式の簡単な例は、次のようなものであろう。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   var nums = [0..3];&lt;br /&gt;   System.out.println(nums == [0,1,2,3]); // trueと表示する&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;既定では各数値間の刻み幅は1だが、異なる刻み幅を指定することもできる。たとえば、次の式は、1から10の間の奇数からなる列を定める。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   [1..10 step 2]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;降順に並んだ値域を生成するためは、終了値が開始値より小さいことを確認し、負数の刻み幅を指定する。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   var nums = [3..0 step -1];&lt;br /&gt;   System.out.println(nums == [3,2,1,0]); // trueと表示する&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次の宣言文は、実際には空の列を宣言することに留意せよ。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var nums1 = [3..0 ];&lt;br /&gt;   var nums2 = [3..0 step 1];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;条件式&lt;br /&gt;if式は、Java言語におけるifと似ている。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   if (condition1) {&lt;br /&gt;       System.out.println("Condition 1");&lt;br /&gt;   } else if (condition2) {&lt;br /&gt;       System.out.println("Condition2");&lt;br /&gt;   } else {&lt;br /&gt;       System.out.println("not Condition 1 or Condition 2");&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Java言語は、if式と条件式（たとえば、a &amp;lt; b ? a : b）の両方を含んでいる。JavaFX言語のif式は、その両者に代わるものである。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;繰り返し式&lt;br /&gt;for式&lt;br /&gt;for式は列とともに用いられるので、第7章で論じる。&lt;br /&gt;&lt;br /&gt;while式&lt;br /&gt;while式はJava言語の場合と同様であるが、whileの本体を囲む中括弧が常に必要である。&lt;br /&gt;例：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   var i = 0;&lt;br /&gt;   while (i &amp;lt; 10) {&lt;br /&gt;       if (i &gt; 5) {&lt;br /&gt;           break;&lt;br /&gt;       }&lt;br /&gt;       System.out.println("i = {i}");&lt;br /&gt;       i += 1;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;そのほかの式&lt;br /&gt;return式は、Java言語において見られるものと同一である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   function add(x, y) {&lt;br /&gt;       return x + y;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;throw式は、Java言語のものと似ているが、java.lang.Throwableを拡張したオブジェクトだけが投げられたり捕捉されたりできる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.Exception;&lt;br /&gt;&lt;br /&gt;   function foo() {&lt;br /&gt;       throw new Exception("this is a java exception");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   function bar() {&lt;br /&gt;       throw "just a string";&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;try式とcatch式は、Java言語のものと似ているが、JavaFX言語の変数宣言の構文を用いる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   try {&lt;br /&gt;       throw "Hello";&lt;br /&gt;   } catch (s:String) {&lt;br /&gt;       System.out.println("caught a String: {s}");&lt;br /&gt;   } catch (any) {&lt;br /&gt;       System.out.println("caught something not a String: {any}");&lt;br /&gt;   } finally {&lt;br /&gt;       System.out.println("finally...");&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;break式とcontinue式は、Java言語のものと似ているが、ラベルは支援されていない。&lt;br /&gt;例：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   function foo() {&lt;br /&gt;       for (i in [0..10]) {&lt;br /&gt;           if (i &gt; 5) {&lt;br /&gt;               break;&lt;br /&gt;           }&lt;br /&gt;           if (i mod 2 == 0) {&lt;br /&gt;               continue;&lt;br /&gt;           }&lt;br /&gt;           System.out.println(i);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   function bar() {&lt;br /&gt;       var i = 0;&lt;br /&gt;       while (i &amp;lt; 10) {&lt;br /&gt;           if (i &gt; 5) {&lt;br /&gt;               break;&lt;br /&gt;           }&lt;br /&gt;           if (i mod 2 == 0) {&lt;br /&gt;               continue;&lt;br /&gt;           }&lt;br /&gt;           System.out.println(i);&lt;br /&gt;           i += 1;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;演算子&lt;br /&gt;JavaFX言語は、Java言語にみられるものと同様の標準的な演算子を提供する。次の表は、Java言語における等価演算子と比較させながら、優先順位に従ってそれらの演算子を一覧表にしたものである。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;                        表 5.1  演算子の優先順位&lt;br /&gt;   優先度  JavaFX演算子    演算                Java演算子    評価順序&lt;br /&gt;   1       function()      JavaFX関数&lt;br /&gt;           ()              括弧内の式&lt;br /&gt;           new             オブジェクト生成&lt;br /&gt;           {オブジェクト   オブジェクト生成&lt;br /&gt;             直定数}         と初期化&lt;br /&gt;   2       ++ (後置)       1増後代入           ++            右から左&lt;br /&gt;           -- (後置)       1減後代入           --&lt;br /&gt;   3       ++ (前置)       1増前代入           ++            右から左&lt;br /&gt;           -- (前置)       1減前代入           --&lt;br /&gt;           not             論理否定&lt;br /&gt;           sizeof          列の要素数&lt;br /&gt;           reverse         列の反転&lt;br /&gt;           indexof         列要素の索引&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;   4       *               乗算                *             左から右&lt;br /&gt;           /               除算                /&lt;br /&gt;           mod             剰余                %&lt;br /&gt;   5       +               加算                +             左から右&lt;br /&gt;           -               減算                -&lt;br /&gt;   6       ==              等価                ==            左から右&lt;br /&gt;           !=              不等価              !=&lt;br /&gt;           &amp;lt;               小なり              &amp;lt;&lt;br /&gt;           &amp;lt;=              以下                &amp;lt;=&lt;br /&gt;           &gt;               大なり              &gt;&lt;br /&gt;           &gt;=              以上                &gt;=&lt;br /&gt;   7       instanceof      型検査              instanceof&lt;br /&gt;           as              型変換&lt;br /&gt;   8       or              論理OR              ||            右から左&lt;br /&gt;   9       and             論理AND             &amp;amp;&amp;amp;            右から左&lt;br /&gt;   10      +=              加算代入            +=&lt;br /&gt;           -=              減算代入            -+&lt;br /&gt;           *=              乗算代入            *=&lt;br /&gt;           /=              除算代入            /=&lt;br /&gt;           %=              剰余代入            %=&lt;br /&gt;   11      =               代入                =&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;例：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;   import java.lang.Math;&lt;br /&gt;&lt;br /&gt;   var x = 2;&lt;br /&gt;   var y = 4;&lt;br /&gt;   var a = true;&lt;br /&gt;   var b = false;&lt;br /&gt;   System.out.println(x == y); // falseを表示する&lt;br /&gt;   System.out.println(x != y); // trueを表示する&lt;br /&gt;   System.out.println(x &amp;lt; y);  // trueを表示する&lt;br /&gt;   System.out.println(x &gt; y);  // falseを表示する&lt;br /&gt;   System.out.println(x &gt;= y); // falseを表示する&lt;br /&gt;   System.out.println(x &amp;lt;= y);  // trueを表示する&lt;br /&gt;   System.out.println(x + y);  // 6を表示する&lt;br /&gt;   System.out.println(x - y);  // -2を表示する&lt;br /&gt;   System.out.println(x * y);  // 8を表示する&lt;br /&gt;   System.out.println(x / y);   // 0を表示する&lt;br /&gt;   System.out.println(x mod y);   // 2を表示する&lt;br /&gt;   System.out.println(a and b); // falseを表示する&lt;br /&gt;   System.out.println(a or b);  // trueを表示する&lt;br /&gt;   System.out.println(not a);  // falseを表示する&lt;br /&gt;   System.out.println(sizeof [x,y]); // 2 を表示する&lt;br /&gt;   System.out.println([x,y][e | indexof e == 0]); // [ 2 ]を表示する&lt;br /&gt;   System.out.println(if (a) x else y); // 2を表示する&lt;br /&gt;   System.out.println(for(q in [x, y] where q &amp;lt; 3) q); // [ 2 ]を表示する&lt;br /&gt;   System.out.println(Math.max(x, y)); // 4を表示する&lt;br /&gt;   System.out.println("abc".toUpperCase()); // ABCを表示する&lt;br /&gt;   System.out.println(x); // 2を表示する&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;訳注：原文で使用している「&amp;lt;&gt;」演算子と「%」演算子は、それぞれ、「!=」と「mod」に書き換えた。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6.列を宣言する&lt;br /&gt;先に述べた5つの基本データ型に加え、JavaFX言語は、「列」として知られたデータ構造を提供する。列はJava言語の配列に似ているが、異なる点もある。&lt;br /&gt;次のコードはいくつかの例を示す。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var weekDays = ["Mon","Tue","Wed","Thur","Fri"];&lt;br /&gt;   var days = [weekDays, ["Sat","Sun"]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;列は、オブジェクトの順序付けられた一覧を表す。しかしながら、列そのものはオブジェクトではないため、入れ子構造を取ることはできない。列は、値により等価であるとみなされる。列の長さが等しく、かつそれらの要素が同一であるとき、列は等しい。（上記のdaysの初期化におけるように）入れ子になった列を形成する式は、自動的に平準化される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   days == ["Mon","Tue","Wed","Thur","Fri","Sat","Sun"]; // trueを返す&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;さらに、単一のオブジェクトは、1つのオブジェクトからなる列に等価である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   1 == [1]; // trueを返す&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;列の型は、「[]」注釈を用いて宣言される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var xs:Number[]; // 数の列&lt;br /&gt;   var strs:String[]; // 文字列の列&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;列の要素は共通の型を持たねばならず、その型はオブジェクトであっても良い。列は、Java言語の配列のように、索引付けることがきる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var wednesday = days[2];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次の例のように、その要素が等差数列をなしている列に対する「..」を用いた簡便な表記法もある。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var nums = [1..100];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この簡略記法により、各要素を手入力する必要がなくなる。&lt;br /&gt;[]演算子は、述語形式の選択も表す。述語は、次の形式を取る。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   列[変数名| 論理式]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;例：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var nums = [1,2,3,4];&lt;br /&gt;   var numsGreaterThanTwo = nums[n|n &gt; 2];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この手の式は、元の列の要素の内、述部の条件を満たすものから構成される新たな列を返す。&lt;br /&gt;最後になったが、部分列は、列の一部を利用できるようにする。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   seq[a..b]  // 索引aとbの間（両端含む）の列&lt;br /&gt;   seq[a..&amp;lt;b] // 索引a（含む）とb（含まない）の間の列&lt;br /&gt;   seq[a..]  // seq[a..&amp;lt;sizeof seq]に同じ&lt;br /&gt;   seq[a..&amp;lt;] // 一貫性を保つため、seq[a..&amp;lt;sizeof seq-1] に同じ&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次の章で述べるように、いくつもの異なる方法で、列または部分列を利用および／または変更することができる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7.列を利用する&lt;br /&gt;&lt;br /&gt;forを用いた列の繰り返し&lt;br /&gt;JavaFX言語は、for演算子を用いた列内包を支援する。列内包は、1つ以上の入力列、任意選択としてのろ過器、および式から構成される。各入力列は変数と関連している。列内包の結果は、元となる列の要素の組み合わせの内で、ろ過器の条件を満たすものに、式を適用した結果であるところの新たな列である。&lt;br /&gt;次のプログラムはこの構文の実例を示したもので、曲集の一覧から曲の一部が表題となっているものを特定するためにfor演算子を用いている。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   class Album {&lt;br /&gt;       attribute title: String;&lt;br /&gt;       attribute artist: String;&lt;br /&gt;       attribute tracks: String[];&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var albums =&lt;br /&gt;       [Album {&lt;br /&gt;           title: "A Hard Day's Night"&lt;br /&gt;           artist: "The Beatles"&lt;br /&gt;           tracks:&lt;br /&gt;               ["A Hard Day's Night",&lt;br /&gt;                "I Should Have Known Better",&lt;br /&gt;                "If I Fell",&lt;br /&gt;                "I'm Happy Just To Dance With You",&lt;br /&gt;                "And I Love Her",&lt;br /&gt;                "Tell Me Why",&lt;br /&gt;                "Can't Buy Me Love",&lt;br /&gt;                "Any Time At All",&lt;br /&gt;                "I'll Cry Instead",&lt;br /&gt;                "Things We Said Today",&lt;br /&gt;                "When I Get Home",&lt;br /&gt;                "You Can't Do That"]&lt;br /&gt;       },&lt;br /&gt;       Album {&lt;br /&gt;           title: "Circle Of Love"&lt;br /&gt;           artist: "Steve Miller Band"&lt;br /&gt;           tracks:&lt;br /&gt;               ["Heart Like A Wheel",&lt;br /&gt;                "Get On Home",&lt;br /&gt;                "Baby Wanna Dance",&lt;br /&gt;                "Circle Of Love",&lt;br /&gt;                "Macho City"]&lt;br /&gt;       }];&lt;br /&gt;&lt;br /&gt;   for (album in albums, track in album.tracks)  {&lt;br /&gt;       if (album.title == track)&lt;br /&gt;           java.lang.System.out.println("TITLE TRACK = {track}")&lt;br /&gt;       else&lt;br /&gt;           java.lang.System.out.println("Track = {track}")&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;出力：&lt;br /&gt;   TITLE TRACK = A Hard Day's Night&lt;br /&gt;   Track = I Should Have Known Better&lt;br /&gt;   Track = If I Fell&lt;br /&gt;   Track = I'm Happy Just To Dance With You&lt;br /&gt;   Track = And I Love Her&lt;br /&gt;   Track = Tell Me Why&lt;br /&gt;   Track = Can't Buy Me Love&lt;br /&gt;   Track = Any Time At All&lt;br /&gt;   Track = I'll Cry Instead&lt;br /&gt;   Track = Things We Said Today&lt;br /&gt;   Track = When I Get Home&lt;br /&gt;   Track = You Can't Do That&lt;br /&gt;   Track = Heart Like A Wheel&lt;br /&gt;   Track = Get On Home&lt;br /&gt;   Track = Baby Wanna Dance&lt;br /&gt;   TITLE TRACK = Circle Of Love&lt;br /&gt;   Track = Macho City&lt;br /&gt;&lt;br /&gt;次に示すのは、ろ過器を用いた別の例である。これは、数を受け取ってその因数の一覧を返す関数を定義したものである。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   function factors(n:Number) {&lt;br /&gt;       return for (i in [1 .. n/2] where n mod i == 0) i;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;訳注：原文の「%」演算子を、「mod」に書き換えた。&lt;br /&gt;&lt;br /&gt;forの内包の中で、indexof演算子を用いることができる。その構文は「indexof 名称」で、「名称」は繰り返し変数の名前である。その値は、基となる列における繰り返しの「索引」値である。&lt;br /&gt;次の例に示したように、indexof演算子は列の抽出に使用することもできる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var nums = [1..5];&lt;br /&gt;   var numsExceptTheFirstTwo = nums[n|indexof n &gt; 1]; // [ 3, 4, 5 ]を返す&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;列変数を変更する&lt;br /&gt;insertは、列に新たな要素を挿入する。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   insert x into seq&lt;br /&gt;   insert x before seq[idx]&lt;br /&gt;   insert x after seq[idx]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;deleteは、列から要素を取り除く。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   delete seq&lt;br /&gt;   delete x from seq&lt;br /&gt;   delete seq[idx]&lt;br /&gt;   delete seq[a..b]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次のコードは、挿入と削除の双方の例である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   // 挿入の例&lt;br /&gt;&lt;br /&gt;   var nums = [1..5];&lt;br /&gt;   var x = 6;&lt;br /&gt;   insert x into nums; // 結果は、[ 1, 2, 3, 4, 5, 6 ]&lt;br /&gt;   x++;&lt;br /&gt;   insert x before nums[0]; // 結果は、[ 7, 1, 2, 3, 4, 5, 6 ]&lt;br /&gt;   x++;&lt;br /&gt;   insert x after nums[3]; // 結果は、[ 7, 1, 2, 3, 8, 4, 5, 6 ]&lt;br /&gt;&lt;br /&gt;   // 削除の例&lt;br /&gt;&lt;br /&gt;   nums = [1..5];&lt;br /&gt;   delete 2 from nums; // 結果は、[ 1, 3, 4, 5 ]&lt;br /&gt;   delete nums[0];// 結果は、[ 3, 4, 5 ]&lt;br /&gt;   nums = [1..10]; // 結果は、[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]&lt;br /&gt;   delete nums[3..7]; // 結果は、[ 1, 2, 3, 9, 10 ]&lt;br /&gt;   delete nums; // 結果は、[ ]&lt;br /&gt;   nums = [1..10];&lt;br /&gt;   delete nums[5..]; // 結果は、[ 1, 2, 3, 4, 5 ]&lt;br /&gt;   delete nums[0..&amp;lt;]; // 結果は、[ 5 ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;訳注：原文では、最後の「delete nums[0..&amp;lt;];」文が「delete nums[0..&gt;];」と誤記されている。&lt;br /&gt;&lt;br /&gt;列の要素を逆順に並べ替えることもできる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   var nums = [1..5];&lt;br /&gt;   reverse nums; // [ 5, 4, 3, 2, 1 ]を返す&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;訳注：2008年7月23日時点のNetBeans 6.1用JavaFX追加接続（Plugin）プログラムで動作確認したところ、「reverse nums;」だけでは、元のnums の要素の並びは変わらなかった（並び替えた結果を利用するためには、「nums = reverse nums;」のように列変数に代入しなおす必要がある。その意味では、delete演算子とは用法が異なる）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8.データ結合&lt;br /&gt;bind鍵語は、対象となる変数の値を別の変数の値に結びつける。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let x = bind someExpression;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これは、someExpressionの結果を変数xに結びつける。someExpressionの値が変わると、xの値も自動的に更新される。結び付けられる変数は、ある基本データ型の単純な値、式の結果、区画式の結果、もしくは結合関数でもよい（let鍵語は、それらに割り当てることができない変数を導入する）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;再計算して更新する&lt;br /&gt;ある状況では、更新がどのように行われるか、あるいはsomeExpressionが変化することはどういう意味なのかを厳密に知っている必要ある。結び付けられる値が変化すると、最小限の再計算が実行される。この再計算は、ある限られた状況において問題になるだけである。たとえば、オブジェクトの生成を必要とする結合が実行される場合で、オブジェクトの同一性の理由から、新たなオブジェクトが実際に生成されたかどうかが問題となるような場合である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let sum = bind expr1 + expr2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;expr2が変化するとsumは再計算されるが、expr1は再計算されない。expr1に対する値はすでに格納されており、単にその値を再度取ってくるだけである。&lt;br /&gt;&lt;br /&gt;次に実例を示す。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   var y = 3;&lt;br /&gt;   function ten() : Integer { 10 }&lt;br /&gt;   let sum = bind ten() + y;&lt;br /&gt;   System.out.println(sum);&lt;br /&gt;   y = 7;&lt;br /&gt;   System.out.println(sum);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;このプログラムの出力は次のようになる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   13&lt;br /&gt;   17&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;yが7に設定されたとき、関数ten()は変化していないので再度呼び出されることはない。関数値は記憶されており再利用される。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;結合と区画式&lt;br /&gt;bindにおいて、区画式の中に存在しうる文は変数宣言だけである。bind内では、（1増および1減を含め）値の割り当ては禁止されていることに留意せよ。したがって、結合区画式は次のような形式を取る。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   bind { var a = expr; var b = expr; var c = expr; expr }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;結合された式に対するいかなる変化も更新を引き起こし、その更新は最小限なので、変数は効率的に結合される。while、insertおよびdeleteは式なので、bindの中に現れてはならないことに留意せよ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;結合と条件式&lt;br /&gt;次の例を考えてみよ。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let x = bind if (condExpr) expr1 else expr2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;condExprが変わると、if式のどちらの分岐が評価されるのかが変わる。expr1またはexpr2に対する変化は、どちらも、他方の式の再計算を引き起こすことはない。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;結合とfor式&lt;br /&gt;次の例を考えてみよ。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let newSeq = bind for (elem in seq) expr;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;もしseqが変わっても、それでもseqに残っている要素に対応するnewSeqの要素は、再計算されない。言い換えれば、要素がseqに挿入されると、その要素にexprを適用した結果がnewSeqの相当する位置に挿入され、newSeqのほかの要素は再計算されない。&lt;br /&gt;この例外は、exprがindexof elemを使用しているために、索引の値が変化した要素を更新する必要がある場合であるが、最小限の更新という規定には合致している。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   var min = 0;&lt;br /&gt;   var max = 3;&lt;br /&gt;   function square(x : Integer) : Integer { x*x }&lt;br /&gt;   let values = bind for (x in [min..max]) square(x);&lt;br /&gt;   System.out.println(values);&lt;br /&gt;   max = 5;&lt;br /&gt;   System.out.println(values);&lt;br /&gt;   min = 1;&lt;br /&gt;   System.out.println(values);&lt;br /&gt;   min = 0;&lt;br /&gt;   System.out.println(values);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この場合、次の再計算が実行される。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   ・0から3の2乗を計算する。&lt;br /&gt;   ・4と5の2乗を計算する（maxが変わっても、0から3の2乗は再計算されない）。&lt;br /&gt;   ・ほかの値は再計算せず、0の2乗を削除する。&lt;br /&gt;   ・0の2乗を戻す。これは、再計算を必要とする。&lt;br /&gt;     この動作は、代わりにinsertやdeleteを用いても同様である。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;結合とオブジェクト直定数&lt;br /&gt;オブジェクト直定数は、演算子や非結合関数のように機能する。オブジェクト直定数の引数の&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let pt = bind Point { x: myX  y: myY  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;myXが変わると、JavaFX言語は、新たなPointオブジェクトを生成する。これは、不変オブジェクトに対して予期された振る舞いでもある。&lt;br /&gt;新たなオブジェクトを生成せずに、xの値がmyXの値を追跡するようにするためには、結合が必要になる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let pt = bind Point { x: bind myX  y: myY  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この例に対しては、おそらくyも同様に結合したいと思うだろう。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let pt = bind Point { x: bind myX  y: bind myY  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ここで、ptは常に同じPointオブジェクトの実体と結合したままである。それは、最初の結合がなくても同様である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   let pt = Point { x: bind myX  y: bind myY  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;結合と関数&lt;br /&gt;非結合関数は、bound鍵語が前置されていない関数である。Java言語の操作やJavaFX言語の関数の呼び出しに関して、その引数のいずれかが変更されると、JavaFX言語はその関数を再度呼び出すが、関数の本体は暗箱である。関数が、その入力となる引数以外に持っている依存性により再計算が引き起こされることはない。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import java.lang.System;&lt;br /&gt;&lt;br /&gt;   class Point {&lt;br /&gt;       attribute x : Number;&lt;br /&gt;       attribute y : Number;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var scale = 1.0;&lt;br /&gt;&lt;br /&gt;   function makePoint(x0 : Number, y0 : Number) : Point {&lt;br /&gt;       Point {&lt;br /&gt;           x: x0 * scale&lt;br /&gt;           y: y0 * scale&lt;br /&gt;        }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var myX = 3.0;&lt;br /&gt;   var myY = 3.0;&lt;br /&gt;   let pt = bind makePoint(myX, myY);&lt;br /&gt;   System.out.println(pt.x);&lt;br /&gt;   myX = 10.0;&lt;br /&gt;   System.out.println(pt.x);&lt;br /&gt;   scale = 2.0;&lt;br /&gt;   System.out.println(pt.x);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;出力：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   3.0&lt;br /&gt;   10.0&lt;br /&gt;   10.0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;引数myXを変更すると、関数makePointは再度呼び出される。しかし、関数makePointは暗箱である。よって、scaleに割り当てられた値を変更しても、当然ではあろうが、関数は再計算されない。これこそが、結合関数が意図したものである。結合関数は予期された更新を引き起こす。&lt;br /&gt;結合関数は、その本体として、結合された区画式を持っている（それゆえに、結合区画式に関する上述の制限を有している）。結合関数に結びつけると、引数以外の変化も更新を引き起こし、かつ引数の変更も調べられる。上述の関数makePointは結合関数にしてもよい。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   bound function makePoint(x0 : Number, y0 : Number) : Point {&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;そうすれば、scaleに割り当てられた値の変化は更新（20.0）を引き起こす。myXが変わるとx0 * scaleだけが再計算され、y0 * scaleは再計算されないことに留意せよ。&lt;br /&gt;結合とは別のところで結合関数を呼び出すことは、非結合関数を呼び出すことと同じことである。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9.引き金&lt;br /&gt;&lt;br /&gt;置換引き金&lt;br /&gt;置換引き金に対する構文は次のとおりである。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;    "on" "replace"&lt;br /&gt;       [旧値]&lt;br /&gt;       [ "[" 最低索引値 ".." 最高索引値 "]" "=" 新要素 ]&lt;br /&gt;       区画&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;置換引き金は、引き金を取り付けた変数に対するすべての変更の後に呼び出される。構文上の非終端子である旧値、最低索引値、最高索引値、および新要素は、その本体が区画から成る関数に対する事実上の仮引数である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   ・旧値は変数の事前の値であり、変数と同じ型を持つ。&lt;br /&gt;   ・最低索引値と最高索引値は、旧値の置換対象となる部分の範囲を&lt;br /&gt;     区切る。それらの型はIntegerである。純然たる挿入に対しては、&lt;br /&gt;     「最高索引値==最低索引値-1」である。&lt;br /&gt;   ・新要素は、部分列「旧値[最低索引値..最高索引値]」を&lt;br /&gt;     置き換える値の列である。その型は変数と同じである。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;引数「[最低索引値..最高索引値]=新要素」は、引き金が取り付けられた変数が列型であるときのみ許される。&lt;br /&gt;旧値と新要素は非対称であることに留意せよ。旧値は、引き金が取り付けられた変数の事前の値であり、一方、新要素は、変更対象となる要素のみから成る、その変数の新値の部分列である。&lt;br /&gt;置換引金の構文は、部分列の割り当てを思い起こさせるようになっている。たとえば：&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   attribute x&lt;br /&gt;           on replace oldVal[lo..hi]=newVals { exp };&lt;br /&gt;   var save = x;&lt;br /&gt;   x[i..j] = y;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;すると、oldVal はsaveに、loはiに、hiはjに、そしてnewValsはyに結びつけられた上で、expが評価される。&lt;br /&gt;統合置換引き金は、部分列の割り当てとうまく機能する。たとえば、次のように結合を定義することができる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   attribute x;&lt;br /&gt;   attribute y = bind x;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これは次と等価である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   attribute x =&lt;br /&gt;           on replace [i..j]=n&lt;br /&gt;           { y[i..j]=n };&lt;br /&gt;   attribute y = [];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次のように、yがxの写像だとする。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   attribute x;&lt;br /&gt;   attribute y = bind for (xi in x) f(xi);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これは次と等価である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   attribute x =&lt;br /&gt;           on replace [i..j]=n&lt;br /&gt;           { y[i..j] = for (k in n) f(k) };&lt;br /&gt;   attribute y = [];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;列の要素のある範囲を削除または置換すること、もしくは列を一箇所に挿入することは、すべて単一の引き金呼び出しに帰着する。述語条件を満たすすべての要素の削除のような、別の演算のあるものは、複数の引き金呼び出しに分解できるかもしれない。その場合、それぞれの引き金呼び出しから見える状態は一致している。特に、プログラマに可視の状態は、あたかも（たとえば）述語削除が独立な部分列削除演算の組として実装されているかのようである。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;10.動画&lt;br /&gt;&lt;br /&gt;動画概要&lt;br /&gt;JavaFXは、主こま（齣）動画（key frame animation）を支援する。これは、プログラマが、各場面の動画による状態遷移を、時系列上のある点における状態の断面（主こま）を宣言することにより表現する宣言様式である。JavaFX言語は、主こま動画の2つの基本的な種類、離散と補間を支援する。その違いは、後者では、専用の補間関数がそれぞれの動画のこま間に存在する状態を計算する。どちらの場合も、処理系は自動的に動画を実行し、要求に従って動画を停止、中断、再開、反転、または繰り返す。&lt;br /&gt;高次では、主こま動画は次のように表現することができる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   ・動画は、javafx.animation.Timelineオブジェクトにより表される&lt;br /&gt;     時系列に沿って再生される。&lt;br /&gt;   ・それぞれの時系列は、javafx.animation.KeyFrameオブジェクト&lt;br /&gt;     により表される2つ以上の主こまを含む。&lt;br /&gt;   ・それぞれの時系列は、それを表現するある種の属性（autoReverse、&lt;br /&gt;     repeatCount、toggle、など）と、再生を制御するいくつかの関数&lt;br /&gt;     （start()、stop()、pause()、およびresume()）を提供する。&lt;br /&gt;   ・それぞれの主こまには、それを含んでいる時系列における相対時刻が&lt;br /&gt;     付随し、それ自身、3つのもの、主値の一覧、従時系列、および&lt;br /&gt;     「引き金」を含む。含まれている従時系列のそれぞれは、主こまの&lt;br /&gt;     主時刻からの相対開始点で評価される。それゆえ、時系列は、&lt;br /&gt;     階層的に構成し、従時系列を含むことができる。従時系列自身、&lt;br /&gt;     同じことを繰り返すことができる。「引き金」は、それが存在すれば、&lt;br /&gt;     主こまで指定された時刻に実行される手続きコードの区画である。&lt;br /&gt;   ・javafx.animation.KeyValueオブジェクトは、ある特性に対し、&lt;br /&gt;     その前の主こまからの相対で「中割り」の値を計算するために&lt;br /&gt;     用いられる関数とともに、主こまのその時刻におけるその特性の&lt;br /&gt;     最終状態を表す。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;注記：Timelineオブジェクトは、図式動画とは無関係な、汎用の時間に基づく演算に対しても使用することできる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;離散動画&lt;br /&gt;離散動画では、特定の性質の値が、主こまの時刻に、主こまで与えられた値に瞬時に変化する。たとえば、よく知られた「転げ回るデューク」の動画を考えてみよう。そこでは、動きの錯覚が、一組の画像を単にパラパラめくりすることによりもたらされる。こうした動画は、それぞれの動画のこまの「中間」を計算しないので、「離散的」である。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import javafx.application.Frame;&lt;br /&gt;   import javafx.application.Stage;&lt;br /&gt;   import javafx.scene.paint.Color;&lt;br /&gt;   import javafx.scene.image.Image;&lt;br /&gt;   import javafx.scene.image.ImageView;&lt;br /&gt;   import javafx.animation.KeyFrame;&lt;br /&gt;   import javafx.animation.Timeline;&lt;br /&gt;&lt;br /&gt;   // 画像データを読み込む&lt;br /&gt;   var images = for (i in [1..17]) {&lt;br /&gt;       Image { url: "file:images/T{i}.gif"};&lt;br /&gt;               // 画像は手元に格納されていると仮定する&lt;br /&gt;&lt;br /&gt;       // ウェブから画像を読み込むには、代わりに次の行&lt;br /&gt;       // （訳注：原文では1行）を使用する&lt;br /&gt;       // Image {url: "http://java.sun.com/applets/other/&lt;br /&gt;       //         TumblingDuke/images/T{i}.gif"};&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // 最初の画像を設定する&lt;br /&gt;   var currDuke = images[0];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   // 画像を繰り返すための時系列を生成する&lt;br /&gt;   var timeline = Timeline {&lt;br /&gt;       toggle: true&lt;br /&gt;       keyFrames: for (image in images) {&lt;br /&gt;           KeyFrame {&lt;br /&gt;               time: 100ms* indexof image&lt;br /&gt;                       // 各こまは100ms離れる&lt;br /&gt;               action: function(){currDuke=image;}&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   Frame {&lt;br /&gt;&lt;br /&gt;       title: "Click on Duke!"&lt;br /&gt;       width: 250&lt;br /&gt;       height: 150&lt;br /&gt;       visible: true&lt;br /&gt;       stage: Stage {&lt;br /&gt;           content: ImageView {&lt;br /&gt;               image: bind currDuke;&lt;br /&gt;               onMouseClicked: function(e) {timeline.start();}&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最初に、このプログラムは画像を記憶装置に読み込み、現在の画像を表すための変数（currDuke）を生成する。次に、時系列を生成し、いくつかの主こま（画像当たり1つ）を設定する。それぞれの主こまは100 msずつ離れて配置され、その画像をcurrDukeに割り当てる。最後に、GUIはその表示画像をcurrDukeと結合し、応用プログラムが動画のこまを繰り返すにつれて、現在の画像が画面上に表示されることを保証する。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;補間動画&lt;br /&gt;動画には、動的に計算しなければならない状態を持っているものもある。次に取り上げる例は、二次元の矩形をその寸法を変えながら回転させ、かつある範囲の表示色を繰り返す。この動画は、動画の経路に沿ったすべての可能な位置に主こまを生成する代わりに、プログラマが数個の主こま（開始、中間、終了）を単に宣言し、処理系にその中間のすべてを計算させるので、補間であるとされる。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;   import javafx.application.Frame;&lt;br /&gt;   import javafx.application.Stage;&lt;br /&gt;   import javafx.scene.geometry.Rectangle;&lt;br /&gt;   import javafx.scene.paint.Color;&lt;br /&gt;   import javafx.scene.transform.Transform;&lt;br /&gt;   import javafx.scene.Cursor;&lt;br /&gt;   import javafx.animation.Timeline;&lt;br /&gt;   import javafx.animation.Interpolator;&lt;br /&gt;&lt;br /&gt;   Frame {&lt;br /&gt;       title: "Animation Demo";&lt;br /&gt;       width: 500&lt;br /&gt;       height: 400&lt;br /&gt;       visible: true&lt;br /&gt;       stage: Stage {&lt;br /&gt;           content: Rectangle {&lt;br /&gt;&lt;br /&gt;               // 変数を宣言する&lt;br /&gt;               var rotation = 0.0;&lt;br /&gt;               var size = 1.0;&lt;br /&gt;               var color = Color.GREEN;&lt;br /&gt;&lt;br /&gt;               // 属性を初期化する&lt;br /&gt;               cursor: Cursor.HAND&lt;br /&gt;               height: 50&lt;br /&gt;               width: 50&lt;br /&gt;               fill: bind color&lt;br /&gt;               transform: bind [Transform.translate(100,100),&lt;br /&gt;                       Transform.scale(size,size),&lt;br /&gt;                       Transform.rotate(rotation,25,25)]&lt;br /&gt;&lt;br /&gt;               // 動画の時系列を生成する&lt;br /&gt;               var myTimeline = Timeline {&lt;br /&gt;&lt;br /&gt;                   toggle: true&lt;br /&gt;&lt;br /&gt;                   // 主こま&lt;br /&gt;                   var begin = at (0s) {&lt;br /&gt;                       size =&gt; 1.0;&lt;br /&gt;                       color =&gt; Color.GREEN;&lt;br /&gt;                       rotation =&gt; 0.0;&lt;br /&gt;                   }&lt;br /&gt;&lt;br /&gt;                   var mid = at (0.5s) {&lt;br /&gt;                       color =&gt; Color.PURPLE&lt;br /&gt;                               tween Interpolator.EASEBOTH;&lt;br /&gt;                   }&lt;br /&gt;&lt;br /&gt;                   var end = at (1s) {&lt;br /&gt;                       size =&gt; 3.0 tween Interpolator.LINEAR;&lt;br /&gt;                       color =&gt; Color.RED&lt;br /&gt;                               tween Interpolator.EASEBOTH;&lt;br /&gt;                       rotation =&gt; 360.0&lt;br /&gt;                               tween Interpolator.EASEBOTH;&lt;br /&gt;                   }&lt;br /&gt;&lt;br /&gt;                   keyFrames: [begin,mid,end]&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;               onMouseClicked: function(e) {&lt;br /&gt;                   myTimeline.start();&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;主こま動画は通常のオブジェクトから生成されるが、作業をより容易にするため、特有の構文、すなわち、=&gt;、tween、およびat演算子が提供されることに留意せよ。この例では、主こまを「at」演算子を用いて生成した。これは、KeyFrameオブジェクトの直定数構築子である。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A.鍵語と予約語&lt;br /&gt;この付録は、JavaFX言語において予約された単語を記録したものである。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;                     表 A.1  鍵語と予約語&lt;br /&gt;                         実装済み鍵語&lt;br /&gt;abstract                    attribute     bind          break&lt;br /&gt;class         continue      delete        false         for&lt;br /&gt;function      if            import        init          insert&lt;br /&gt;             new           not           null          package&lt;br /&gt;private                     public                      return&lt;br /&gt;super         sizeof                      this          throw&lt;br /&gt;try           true          var           while         after&lt;br /&gt;and           as            before                      catch&lt;br /&gt;             dur           else          exclusive     extends&lt;br /&gt;finally                                   in            bound&lt;br /&gt;indexof       into          inverse       lazy&lt;br /&gt;on            or            replace       step&lt;br /&gt;with          where         instanceof    override      at&lt;br /&gt;then          tween&lt;br /&gt;&lt;br /&gt;                         予約済み鍵語&lt;br /&gt;assert        by            do            first         from&lt;br /&gt;last          let           protected     readonly      typeof&lt;br /&gt;lazy&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1576500451828003512?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1576500451828003512/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1576500451828003512' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1576500451828003512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1576500451828003512'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/08/javafx.html' title='JavaFX台本型プログラミング言語基準（草案）：改訂版'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-5675851924729819683</id><published>2008-08-03T18:11:00.008+09:00</published><updated>2008-12-11T09:24:45.805+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>SCADA UIプログラム例のJavaFX SDK対応書き換え：残り</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_v58IVq86t4s/SJV41DdSUTI/AAAAAAAAACk/7kXKHv6Nuag/s1600-h/BlogSampleScadaUI02.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_v58IVq86t4s/SJV41DdSUTI/AAAAAAAAACk/7kXKHv6Nuag/s320/BlogSampleScadaUI02.JPG" alt="" id="BLOGGER_PHOTO_ID_5230219395117240626" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA UIプログラム例の残りの部分を、JavaFX SDK対応に書き換えました。&lt;br /&gt;新たな書き換えの要因として、次のものがあります。&lt;br /&gt;・差分が1と異なる列の指定のしかたが、たとえば、[0,20..100]から[0..100 step 20]のように変わった。&lt;br /&gt;・ConfirmDialogがないので、 javafx.application.Dialogに変えた。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA UI構成単位のJavaFXファイルを置き換えて&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;、企画を再構築して実行すると、図のような画面が表示されます。&lt;br /&gt;次に、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA UI構成単位の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFXファイルを示します。&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;/*&lt;br /&gt; * ScadaClientUI.fx&lt;br /&gt; * An example of a User Interface (UI) module of the client-side&lt;br /&gt; * Presentation component for a SCADA application.&lt;br /&gt; *&lt;br /&gt; * Created and modified:&lt;br /&gt; * V 1.0.0    2008/08/01&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.application.*;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.geometry.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import client.ScadaClientControl;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author terra&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;var scc: ScadaClientControl = new ScadaClientControl();&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * A control compenent for SCADA Data in the UI module.&lt;br /&gt; */&lt;br /&gt;class ScadaDataControl {&lt;br /&gt;  attribute newNumericDatum: Number;&lt;br /&gt;  attribute numericData: Number[] = for (i in [0..180]) 0.0;&lt;br /&gt;  attribute alarting: Boolean;&lt;br /&gt;  attribute schedular: Timeline = Timeline{&lt;br /&gt;    repeatCount: Timeline.INDEFINITE&lt;br /&gt;    keyFrames: KeyFrame {&lt;br /&gt;      time: 200ms&lt;br /&gt;      action: function(): Void {&lt;br /&gt;        newNumericDatum = scc.receiveData();&lt;br /&gt;        delete numericData[0];&lt;br /&gt;        insert newNumericDatum into numericData;&lt;br /&gt;        if (newNumericDatum &gt; 90.0 and not alarting) {&lt;br /&gt;          alarting = true;&lt;br /&gt;          scc.startAlarm();&lt;br /&gt;          Dialog {&lt;br /&gt;            title: "Alarm"&lt;br /&gt;            width: 300, height: 60&lt;br /&gt;            visible: true&lt;br /&gt;            closeAction: function() {&lt;br /&gt;              scc.stopAlarm();&lt;br /&gt;              alarting = false;&lt;br /&gt;            }&lt;br /&gt;            stage: Stage {&lt;br /&gt;              content: Text {&lt;br /&gt;                x: 10, y: 10&lt;br /&gt;                textOrigin: TextOrigin.TOP&lt;br /&gt;                fill: Color.RED&lt;br /&gt;                font: Font {size: 14}&lt;br /&gt;                content: "Flow rate exceeded the second upper limit!"&lt;br /&gt;              }&lt;br /&gt;            }&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  function getDisplayColor(value: Number): Color {&lt;br /&gt;    var c: Color = Color.GREEN;&lt;br /&gt;    if (value &gt; 90.0) {&lt;br /&gt;      c = Color.RED;&lt;br /&gt;    } else if (value &gt; 75.0) {&lt;br /&gt;      c = Color.color(1.0, 0.6, 0.0);&lt;br /&gt;    }&lt;br /&gt;    return c;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var sdc = ScadaDataControl {};&lt;br /&gt;sdc.schedular.start();&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;  title: "SCADA UI Example"&lt;br /&gt;  width: 800, height: 632&lt;br /&gt;  visible: true&lt;br /&gt;  closeAction: function(): Void {System.exit(0);}&lt;br /&gt;  stage: Stage {&lt;br /&gt;    width: 800, height: 600&lt;br /&gt;    fill: Color.color(0.9, 0.9, 0.9)&lt;br /&gt;    content: [&lt;br /&gt;      Group {&lt;br /&gt;        translateX: 50, translateY: 50&lt;br /&gt;        content: [&lt;br /&gt;          Rectangle {&lt;br /&gt;            width: 55, height: 18&lt;br /&gt;            arcWidth: 4, arcHeight: 4&lt;br /&gt;            stroke: Color.BLUE, fill: Color.WHITE&lt;br /&gt;          },&lt;br /&gt;          Text {&lt;br /&gt;            x: 4, y: 5&lt;br /&gt;            textOrigin: TextOrigin.TOP&lt;br /&gt;            fill: bind sdc.getDisplayColor(sdc.newNumericDatum)&lt;br /&gt;            font: Font {&lt;br /&gt;              name: "Monospaced", size: 14, style: FontStyle.PLAIN&lt;br /&gt;            }&lt;br /&gt;            content: bind "{%7.2f sdc.newNumericDatum}"&lt;br /&gt;          },&lt;br /&gt;          Text {&lt;br /&gt;            x: 60, y: 6&lt;br /&gt;            textOrigin: TextOrigin.TOP&lt;br /&gt;            font: Font {&lt;br /&gt;              name: "Monospaced", size: 14, style: FontStyle.PLAIN&lt;br /&gt;            }&lt;br /&gt;            content: "m3/s"&lt;br /&gt;          }&lt;br /&gt;        ]&lt;br /&gt;      },&lt;br /&gt;      Group {&lt;br /&gt;        translateX: 200, translateY: 50&lt;br /&gt;        content: [&lt;br /&gt;          Rectangle {&lt;br /&gt;            width: 60, height: 120&lt;br /&gt;            stroke: Color.BLUE, fill: Color.WHITE&lt;br /&gt;          },&lt;br /&gt;          Rectangle {&lt;br /&gt;            x: 10, y: 10&lt;br /&gt;            width: 10, height: 100&lt;br /&gt;            fill: LinearGradient {&lt;br /&gt;              startX: 0.0, startY: 0.0&lt;br /&gt;              endX: 0.0, endY: 1.0&lt;br /&gt;              stops: [&lt;br /&gt;                Stop {offset: 0.05, color: Color.RED},&lt;br /&gt;                Stop {offset: 0.0875, color: Color.color(1.0, 0.6, 0.0)},&lt;br /&gt;                Stop {offset: 0.125, color: Color.LIMEGREEN},&lt;br /&gt;              ]&lt;br /&gt;            }&lt;br /&gt;          },&lt;br /&gt;          Rectangle {&lt;br /&gt;            x: 10, y: 10&lt;br /&gt;            width: 10, height: bind 50 - sdc.newNumericDatum / 2&lt;br /&gt;            fill: Color.BLACK&lt;br /&gt;          },&lt;br /&gt;          Line {&lt;br /&gt;            startX: 23, startY: 10&lt;br /&gt;            endX: 23, endY: 110&lt;br /&gt;            stroke: Color.BLACK&lt;br /&gt;          },&lt;br /&gt;          Group {&lt;br /&gt;            translateX: 23, translateY: 10&lt;br /&gt;            content: for (i in [-100..100 step 50]) Line {&lt;br /&gt;              translateY: i / 2 + 50&lt;br /&gt;              startX: 0, startY: 0&lt;br /&gt;              endX: 3, endY: 0&lt;br /&gt;              stroke: Color.BLACK&lt;br /&gt;            }&lt;br /&gt;          },&lt;br /&gt;          Group {&lt;br /&gt;            translateX: 32, translateY: 10&lt;br /&gt;            content: for (i in [-100..100 step 50]) Text {&lt;br /&gt;              translateY: 53 - i / 2&lt;br /&gt;              content: "{i}"&lt;br /&gt;              font: Font {&lt;br /&gt;                name: "Monospaced", size: 10, style: FontStyle.PLAIN&lt;br /&gt;              }&lt;br /&gt;              horizontalAlignment: HorizontalAlignment.LEADING&lt;br /&gt;              verticalAlignment: VerticalAlignment.TOP&lt;br /&gt;            }&lt;br /&gt;          }&lt;br /&gt;        ]&lt;br /&gt;      },&lt;br /&gt;      Group {&lt;br /&gt;        translateX: 50, translateY: 200&lt;br /&gt;        content: [&lt;br /&gt;          Rectangle {&lt;br /&gt;            width: 230, height: 120&lt;br /&gt;            stroke: Color.BLUE, fill: Color.WHITE&lt;br /&gt;          },&lt;br /&gt;          Rectangle {&lt;br /&gt;            x: 10, y: 22&lt;br /&gt;            width: 181, height: 88&lt;br /&gt;            fill: Color.BLACK&lt;br /&gt;          },&lt;br /&gt;          Rectangle {&lt;br /&gt;            x: 10, y: 15&lt;br /&gt;            width: 181, height: 7&lt;br /&gt;            fill: Color.GRAY&lt;br /&gt;          },&lt;br /&gt;          Rectangle {&lt;br /&gt;            x: 10, y: 10&lt;br /&gt;            width: 181, height: 5&lt;br /&gt;            fill: Color.DARKGRAY&lt;br /&gt;          },&lt;br /&gt;          Line {&lt;br /&gt;            startX: 194, startY: 10&lt;br /&gt;            endX: 194, endY: 110&lt;br /&gt;            stroke: Color.BLACK&lt;br /&gt;          },&lt;br /&gt;          Group {&lt;br /&gt;            translateX: 194, translateY: 10&lt;br /&gt;            content: for (i in [-100..100 step 50]) Line {&lt;br /&gt;              translateY: i / 2 + 50&lt;br /&gt;              startX: 0, startY: 0&lt;br /&gt;              endX: 3, endY: 0&lt;br /&gt;              stroke: Color.BLACK&lt;br /&gt;            }&lt;br /&gt;          },&lt;br /&gt;          Group {&lt;br /&gt;            translateX: 203, translateY: 11&lt;br /&gt;            content: for (i in [-100..100 step 50]) Text {&lt;br /&gt;              translateY: 53 - i / 2&lt;br /&gt;              content: "{i}"&lt;br /&gt;              font: Font {&lt;br /&gt;                name: "Monospaced", size: 10, style: FontStyle.PLAIN&lt;br /&gt;              }&lt;br /&gt;              horizontalAlignment: HorizontalAlignment.LEADING&lt;br /&gt;              verticalAlignment: VerticalAlignment.TOP&lt;br /&gt;            }&lt;br /&gt;          },&lt;br /&gt;          Group {&lt;br /&gt;            translateX: 10, translateY: 10&lt;br /&gt;            content: for (i in [0..179]) Line {&lt;br /&gt;              translateX: i&lt;br /&gt;              startX: 0, startY: bind 50 - sdc.numericData[i] / 2&lt;br /&gt;              endX: 1, endY: bind 50 - sdc.numericData[i + 1] / 2&lt;br /&gt;              strokeWidth: 2&lt;br /&gt;              stroke: bind sdc.getDisplayColor(sdc.numericData[i + 1])&lt;br /&gt;            }&lt;br /&gt;          }&lt;br /&gt;        ]&lt;br /&gt;      }&lt;br /&gt;    ]&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-5675851924729819683?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/5675851924729819683/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=5675851924729819683' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5675851924729819683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5675851924729819683'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/08/scada-uijavafx-sdk_03.html' title='SCADA UIプログラム例のJavaFX SDK対応書き換え：残り'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_v58IVq86t4s/SJV41DdSUTI/AAAAAAAAACk/7kXKHv6Nuag/s72-c/BlogSampleScadaUI02.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-7593309186247571923</id><published>2008-08-02T15:49:00.019+09:00</published><updated>2008-12-11T09:24:46.101+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>SCADA UIプログラム例のJavaFX SDK対応書き換え：数値指示計</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_v58IVq86t4s/SJQPNsM30MI/AAAAAAAAACU/6j3qTGAcaFY/s1600-h/BlogSampleScadaUI01.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_v58IVq86t4s/SJQPNsM30MI/AAAAAAAAACU/6j3qTGAcaFY/s320/BlogSampleScadaUI01.JPG" alt="" id="BLOGGER_PHOTO_ID_5229821795161854146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;次に、&lt;a href="http://terrasweblog.blogspot.com/2008/01/javafx-scada-ui2.html"&gt;SCADA UIプログラムの例&lt;/a&gt;を、JavaFX SDK対応に書き換えてみます。今回は、数値指示計の部分を書き換えました。&lt;br /&gt;逐次解釈型では、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Textオブジェクトで&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「%m.nf」形式の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;書式付き出力を行うと、&lt;/span&gt;&lt;a href="http://terrasweblog.blogspot.com/2007/12/javafx-scada-uiui.html"&gt;&lt;span style="font-family:lucida grande;"&gt;頭の空白文字が無視されという&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;a href="http://terrasweblog.blogspot.com/2007/12/javafx-scada-uiui.html"&gt;不備な点がありました&lt;/a&gt;が&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;、それは修正されています。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;NetBeansで、JavaFX企画を作成し、SCADA UI構成単位のJavaFXファイルと依頼機&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を模擬する制御&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;構成単位のJavaファイルを作成し、警報音源ファイルを置いて、企画を構築して実行すると、図のような数値指示計の画面が表示されます。&lt;br /&gt;次に、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA UI構成単位の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFXファイルを示します。&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;/*&lt;br /&gt; * ScadaClientUI.fx&lt;br /&gt; * An example of a User Interface (UI) module of the client-side Presentation&lt;br /&gt; * component for a SCADA application.&lt;br /&gt; *&lt;br /&gt; * Created and modified:&lt;br /&gt; * V 1.0.0    2008/08/01&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import javafx.animation.*;&lt;br /&gt;import javafx.application.*;&lt;br /&gt;import javafx.scene.*;&lt;br /&gt;import javafx.scene.geometry.*;&lt;br /&gt;import javafx.scene.paint.*;&lt;br /&gt;import javafx.scene.text.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import client.ScadaClientControl;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author terra&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;var scc: ScadaClientControl = new ScadaClientControl();&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * A control compenent for SCADA Data in the UI module.&lt;br /&gt; */&lt;br /&gt;class ScadaDataControl {&lt;br /&gt;  attribute numericData: Number;&lt;br /&gt;  attribute schedular: Timeline = Timeline{&lt;br /&gt;   repeatCount: Timeline.INDEFINITE&lt;br /&gt;   keyFrames: KeyFrame {&lt;br /&gt;     time: 200ms&lt;br /&gt;     action: function(): Void {&lt;br /&gt;       numericData = scc.receiveData();&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  function getDisplayColor(value: Number): Color {&lt;br /&gt;    var c: Color = Color.GREEN;&lt;br /&gt;    if (value &gt; 90.0) {&lt;br /&gt;      c = Color.RED;&lt;br /&gt;    } else if (value &gt; 75.0) {&lt;br /&gt;      c = Color.color(1.0, 0.6, 0.0);&lt;br /&gt;    }&lt;br /&gt;    return c;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var sdc = ScadaDataControl {};&lt;br /&gt;sdc.schedular.start();&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;  title: "SCADA UI Example"&lt;br /&gt;  width: 800, height: 632&lt;br /&gt;  visible: true&lt;br /&gt;  closeAction: function(): Void {System.exit(0);}&lt;br /&gt;  stage: Stage {&lt;br /&gt;   width: 800, height: 600&lt;br /&gt;   fill: Color.color(0.9, 0.9, 0.9)&lt;br /&gt;   content: [&lt;br /&gt;     Group {&lt;br /&gt;       translateX: 50, translateY: 50&lt;br /&gt;       content: [&lt;br /&gt;         Rectangle {&lt;br /&gt;           width: 55, height: 18&lt;br /&gt;           arcWidth: 4, arcHeight: 4&lt;br /&gt;           stroke: Color.BLUE, fill: Color.WHITE&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           x: 4, y: 5&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: bind sdc.getDisplayColor(sdc.numericData)&lt;br /&gt;           font: Font {name: "Monospaced", size: 14, style: FontStyle.PLAIN}&lt;br /&gt;           content: bind "{%7.2f sdc.numericData}"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           x: 60, y: 6&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           font: Font {name: "Monospaced", size: 14, style: FontStyle.PLAIN}&lt;br /&gt;           content: "m3/s"&lt;br /&gt;         }&lt;br /&gt;       ]&lt;br /&gt;     }&lt;br /&gt;   ]&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;また、&lt;span style="font-family:lucida grande;"&gt;模擬&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;依頼機&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;制御&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;構成単位のJavaファイルを示します。&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;/*&lt;br /&gt; * ScadaClientControl.java&lt;br /&gt; * An example of the client-side Control component for a SCADA application.&lt;br /&gt; *&lt;br /&gt; * Created and modified:&lt;br /&gt; * V 1.0.0    2008/07/31&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import java.applet.Applet;&lt;br /&gt;import java.applet.AudioClip;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author terra&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;public class ScadaClientControl {&lt;br /&gt;  private AudioClip ac = Applet.newAudioClip(&lt;br /&gt;     ScadaClientControl.class.getResource("ALERT.WAV"));&lt;br /&gt;  private int i = -1;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Create and return pseudo SCADA data as if received from a server.&lt;br /&gt;   */&lt;br /&gt;  public double receiveData() {&lt;br /&gt;   i += 1;&lt;br /&gt;   if (i &gt;= 360) {&lt;br /&gt;     i = 0;&lt;br /&gt;   }&lt;br /&gt;   return (double) Math.sin(i * Math.PI / 180) * 100;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Start sounding the alarm.&lt;br /&gt;  */&lt;br /&gt;  public void startAlarm() {&lt;br /&gt;    ac.loop();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Stop sounding the alarm.&lt;br /&gt;   */&lt;br /&gt;  public void stopAlarm() {&lt;br /&gt;    ac.stop();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Main method for testing this class.&lt;br /&gt;   *&lt;br /&gt;   * @param args the command line arguments&lt;br /&gt;   */&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    ScadaClientControl scc = new ScadaClientControl();&lt;br /&gt;&lt;br /&gt;    for (int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;      System.out.println(scc.receiveData());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    scc.startAlarm();&lt;br /&gt;    JOptionPane.showMessageDialog(null, "Alarm is sounding！", "Alarm test",&lt;br /&gt;        JOptionPane.WARNING_MESSAGE);&lt;br /&gt;    scc.stopAlarm();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-7593309186247571923?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/7593309186247571923/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=7593309186247571923' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7593309186247571923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7593309186247571923'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/08/scada-uijavafx-sdk.html' title='SCADA UIプログラム例のJavaFX SDK対応書き換え：数値指示計'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_v58IVq86t4s/SJQPNsM30MI/AAAAAAAAACU/6j3qTGAcaFY/s72-c/BlogSampleScadaUI01.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3719638078215872130</id><published>2008-07-30T18:12:00.006+09:00</published><updated>2008-12-11T09:24:47.240+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>目覚まし時計プログラムをJavaFX SDK対応に書き換える</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_v58IVq86t4s/SJA2uChQlxI/AAAAAAAAACM/RYHecbFrPW8/s1600-h/BlogSampleAlarmClock.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_v58IVq86t4s/SJA2uChQlxI/AAAAAAAAACM/RYHecbFrPW8/s200/BlogSampleAlarmClock.JPG" alt="" id="BLOGGER_PHOTO_ID_5228739331955398418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;以前に&lt;a href="http://terrasweblog.blogspot.com/2007/12/javafx_05.html"&gt;投稿&lt;/a&gt;した、目覚まし時計プログラムをJavaFX SDK対応に書き換えてみました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;a href="http://openjfx.java.sun.com/current-build/doc/api/index.html"&gt;JavaFX SDKのAPI文書&lt;/a&gt;に、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Spinnerクラスが見つからなかったので、Sliderクラスに置き換えてみました&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。また、パッケージ名を「timer」から「clock」に変更しています。&lt;br /&gt;NetBeansで、JavaFX企画を作成し、目覚まし時計プログラムの本体JavaFXファイルと警報鳴動Javaファイルを作成し、警報音源ファイルを置いて、企画を構築して実行すると、図のような画面が表示されます。&lt;br /&gt;次に、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;本体の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;目覚まし時計&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFXファイルを示します。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;package clock;&lt;br /&gt;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;import javafx.animation.KeyFrame;&lt;br /&gt;import javafx.application.Frame;&lt;br /&gt;import javafx.application.Stage;&lt;br /&gt;import javafx.ext.swing.BorderPanel;&lt;br /&gt;import javafx.ext.swing.Button;&lt;br /&gt;import javafx.ext.swing.Canvas;&lt;br /&gt;import javafx.ext.swing.FlowPanel;&lt;br /&gt;import javafx.ext.swing.GridPanel;&lt;br /&gt;import javafx.ext.swing.Label;&lt;br /&gt;import javafx.ext.swing.Slider;&lt;br /&gt;import javafx.ext.swing.SwingFrame;&lt;br /&gt;import javafx.ext.swing.Slider;&lt;br /&gt;import javafx.ext.swing.TextField;&lt;br /&gt;import javafx.scene.Font;&lt;br /&gt;import javafx.scene.FontStyle;&lt;br /&gt;import javafx.scene.Group;&lt;br /&gt;import javafx.scene.HorizontalAlignment;&lt;br /&gt;import javafx.scene.VerticalAlignment;&lt;br /&gt;import javafx.scene.geometry.Circle;&lt;br /&gt;import javafx.scene.geometry.Line;&lt;br /&gt;import javafx.scene.geometry.Rectangle;&lt;br /&gt;import javafx.scene.layout.VBox;&lt;br /&gt;import javafx.scene.Orientation;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.scene.text.Text;&lt;br /&gt;import javafx.scene.transform.Translate;&lt;br /&gt;import javafx.scene.transform.Rotate;&lt;br /&gt;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;import clock.Sound;&lt;br /&gt;&lt;br /&gt;public class Alarm {&lt;br /&gt; private attribute elapsed: Number;&lt;br /&gt; public attribute seconds: Integer = 0;&lt;br /&gt; public attribute minutes: Integer = 0;&lt;br /&gt; public attribute hours: Integer = 0;&lt;br /&gt; public attribute count: Number = 0;&lt;br /&gt; public attribute startTime: Number;&lt;br /&gt; public attribute elapsedTime: Number;&lt;br /&gt; public attribute remainingTime: Number;&lt;br /&gt; public attribute alarmEnabled: Boolean = false;&lt;br /&gt; public attribute running: Boolean = false on replace {&lt;br /&gt;   if ((alarmEnabled == true) and (remainingTime &amp;lt;= 0)) {&lt;br /&gt;     alarmEnabled = false;&lt;br /&gt;     Sound.alarm();&lt;br /&gt;   }&lt;br /&gt; };&lt;br /&gt; public attribute timer: Timeline = Timeline {&lt;br /&gt;   repeatCount : Timeline.INDEFINITE&lt;br /&gt;   keyFrames : KeyFrame {&lt;br /&gt;     time: 1s&lt;br /&gt;     action: function(): Void {&lt;br /&gt;       var now = new Date();&lt;br /&gt;       elapsedTime = now.getTime() / 1000 - startTime;&lt;br /&gt;       remainingTime = count - elapsedTime;&lt;br /&gt;       seconds = remainingTime mod 60 as Integer;&lt;br /&gt;       minutes = (remainingTime / 60) mod 60 as Integer;&lt;br /&gt;       hours = (remainingTime / 60) / 60 as Integer;&lt;br /&gt;       if (elapsedTime &gt;= count) {&lt;br /&gt;         timer.stop();&lt;br /&gt;         running = false;&lt;br /&gt;         hours = 0;&lt;br /&gt;         minutes = 0;&lt;br /&gt;         seconds = 0;&lt;br /&gt;       } else {&lt;br /&gt;         running = true;&lt;br /&gt;       }&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt; };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SwingFrame {&lt;br /&gt; var alarm = Alarm {}&lt;br /&gt; title: "Alarm Clock"&lt;br /&gt; width: 250&lt;br /&gt; height: 350&lt;br /&gt; visible: true&lt;br /&gt; closeAction: function(): Void {&lt;br /&gt;   System.exit(0);&lt;br /&gt; }&lt;br /&gt; content: BorderPanel {&lt;br /&gt;   center: Canvas {&lt;br /&gt;     content: Group {&lt;br /&gt;       var font = Font {&lt;br /&gt;         name: "Dialog"&lt;br /&gt;         style: FontStyle.PLAIN&lt;br /&gt;         size: 15&lt;br /&gt;       };&lt;br /&gt;       var secs: Number = bind alarm.seconds&lt;br /&gt;       var mins: Number = bind alarm.minutes + secs / 60&lt;br /&gt;       var hrs: Number = bind alarm.hours + mins / 60&lt;br /&gt;       content: [&lt;br /&gt;         Rectangle {&lt;br /&gt;           width: 250, height: 215&lt;br /&gt;           fill: Color.color(0.9, 0.9, 0.9)&lt;br /&gt;         },&lt;br /&gt;         Circle {&lt;br /&gt;           centerX: 120, centerY: 90, radius: 80&lt;br /&gt;           fill: Color.WHITE, stroke: Color.BLACK&lt;br /&gt;           strokeWidth: 1},&lt;br /&gt;         Group {&lt;br /&gt;           transform: Translate {x: 120, y: 100}&lt;br /&gt;           content: for (i in [1..12]) Text {&lt;br /&gt;             var radians = Math.toRadians(30 * i - 90)&lt;br /&gt;             transform: Translate {x: 70 * Math.cos(radians),&lt;br /&gt;                 y: 70 * Math.sin(radians)}&lt;br /&gt;             content: "{i}"&lt;br /&gt;             horizontalAlignment: HorizontalAlignment.CENTER&lt;br /&gt;             verticalAlignment: VerticalAlignment.CENTER&lt;br /&gt;           }&lt;br /&gt;         },&lt;br /&gt;         Group {&lt;br /&gt;           transform: [Translate {x: 120, y: 90}]&lt;br /&gt;           var hourHand = Line {&lt;br /&gt;             startX: 0, startY: 0, endX: 0, endY: -35,&lt;br /&gt;             strokeWidth: 4, stroke: Color.BLACK&lt;br /&gt;             transform: bind Rotate {angle: hrs * 30, x: 0, y: 0}&lt;br /&gt;           }&lt;br /&gt;           var minuteHand = Line {&lt;br /&gt;             startX: 0, startY: 0, endX: 0, endY: -55,&lt;br /&gt;             strokeWidth: 2, stroke: Color.BLUE,&lt;br /&gt;             transform: bind Rotate {angle: mins * 6, x: 0, y: 0}&lt;br /&gt;           }&lt;br /&gt;           var secondHand = Line {&lt;br /&gt;             startX: 0, startY: 0, endX: 0, endY: -75,&lt;br /&gt;             strokeWidth: 1, stroke: Color.RED,&lt;br /&gt;             transform: bind Rotate {angle: alarm.seconds * 6, x: 0, y: 0}&lt;br /&gt;           }&lt;br /&gt;           content: [hourHand, minuteHand, secondHand]&lt;br /&gt;         },&lt;br /&gt;         Circle {&lt;br /&gt;           centerX: 120, centerY: 90, radius: 3&lt;br /&gt;           fill: Color.BLACK, stroke: Color.BLACK&lt;br /&gt;         }&lt;br /&gt;       ]&lt;br /&gt;     },&lt;br /&gt;   }&lt;br /&gt;   bottom: GridPanel {&lt;br /&gt;     rows: 4&lt;br /&gt;     columns: 1&lt;br /&gt;     content: [&lt;br /&gt;       FlowPanel {&lt;br /&gt;         background: Color.WHITE&lt;br /&gt;         content: [&lt;br /&gt;           Slider {&lt;br /&gt;             minimum: 0, maximum: 11&lt;br /&gt;             value: bind alarm.hours with inverse&lt;br /&gt;             enabled: bind not(alarm.running)&lt;br /&gt;           },&lt;br /&gt;           Label {&lt;br /&gt;             enabled: bind not(alarm.running)&lt;br /&gt;             text: "hour"&lt;br /&gt;           }&lt;br /&gt;         ]&lt;br /&gt;       },&lt;br /&gt;       FlowPanel {&lt;br /&gt;         background: Color.WHITE&lt;br /&gt;         content: [&lt;br /&gt;           Slider {&lt;br /&gt;             minimum: 0, maximum: 59&lt;br /&gt;             value: bind alarm.minutes with inverse&lt;br /&gt;             enabled: bind not(alarm.running)&lt;br /&gt;           },&lt;br /&gt;           Label {&lt;br /&gt;             enabled: bind not(alarm.running)&lt;br /&gt;             text: "min "&lt;br /&gt;           }&lt;br /&gt;         ]&lt;br /&gt;       },&lt;br /&gt;       FlowPanel {&lt;br /&gt;         background: Color.WHITE&lt;br /&gt;         content: [&lt;br /&gt;           Slider {&lt;br /&gt;             minimum: 0, maximum: 59&lt;br /&gt;             value: bind alarm.seconds with inverse&lt;br /&gt;             enabled: bind not(alarm.running)&lt;br /&gt;           },&lt;br /&gt;           Label {&lt;br /&gt;             enabled: bind not(alarm.running)&lt;br /&gt;             text: "sec "&lt;br /&gt;           }&lt;br /&gt;         ]&lt;br /&gt;       },&lt;br /&gt;       FlowPanel {&lt;br /&gt;         background: Color.WHITE&lt;br /&gt;         hgap: 40&lt;br /&gt;         content: [&lt;br /&gt;           Button {&lt;br /&gt;             enabled: bind alarm.running&lt;br /&gt;             text: "Stop"&lt;br /&gt;             action: bind function(): Void {&lt;br /&gt;               alarm.running = false;&lt;br /&gt;               alarm.timer.stop();&lt;br /&gt;             }&lt;br /&gt;           },&lt;br /&gt;           Button {&lt;br /&gt;             enabled: bind not(alarm.running)&lt;br /&gt;             text: "Start"&lt;br /&gt;             action: function(): Void {&lt;br /&gt;               var date = new Date();&lt;br /&gt;               alarm.count = alarm.hours * 3600 + alarm.minutes * 60&lt;br /&gt;                   + alarm.seconds;&lt;br /&gt;               alarm.startTime = date.getTime() / 1000;&lt;br /&gt;               alarm.remainingTime = alarm.count;&lt;br /&gt;               if (alarm.count != 0) {&lt;br /&gt;                 alarm.alarmEnabled = true;&lt;br /&gt;                 alarm.running = true;&lt;br /&gt;                 alarm.timer.start();&lt;br /&gt;               }&lt;br /&gt;             }&lt;br /&gt;           }&lt;br /&gt;         ]&lt;br /&gt;       }&lt;br /&gt;     ]&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;また、次に警報鳴動Javaファイルを示します。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;package clock;&lt;br /&gt;&lt;br /&gt;import java.applet.Applet;&lt;br /&gt;import java.applet.AudioClip;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;&lt;br /&gt;public class Sound {&lt;br /&gt; public static void alarm() {&lt;br /&gt;   AudioClip ac&lt;br /&gt;       = Applet.newAudioClip(Sound.class.getResource("TestMusic.wav"));&lt;br /&gt;   ac.loop();&lt;br /&gt;   JOptionPane.showMessageDialog(null, "時間ですよ！", "警告！警告！",&lt;br /&gt;       JOptionPane.WARNING_MESSAGE);&lt;br /&gt;   ac.stop();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;   Sound.alarm();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上述のJavaFX API文書は、実装されているものとクラス名や属性名が異なっていたり、未実装の機能が存在します。そのため、現状では、多少の試行錯誤が必要です。&lt;br /&gt;また、「&lt;a href="http://openjfx.java.sun.com/current-build/doc/reference/JavaFX-Language.html"&gt;The JavaFX™ Script Programming Language Reference  (Draft)&lt;/a&gt;」の「&lt;a href="http://openjfx.java.sun.com/current-build/doc/reference/expressions.html"&gt;Chapter 5. Expressions and Operators&lt;/a&gt;」に載っている演算子の表は、「&lt;a href="http://terrasweblog.blogspot.com/2008/07/javafx5.html"&gt;JavaFX台本型プログラミング言語基準（草案）：第5章&lt;/a&gt;」を投稿した後に、変更されています。演算子の剰余は「%」から「mod」に、不等価は「&amp;lt;&gt;」から「!=」になりました。変更があったことについては記されておらず（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;元&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;元&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;、Draft（草案）ですから、仕方ありませんが…）、同ページに載っているコード例では、前の演算子がそのまま使われているので、注意が必要です（「表の方が最新です」と言いたいのですが、「以上」の演算子「&gt;=」が「=&gt;」（動画の補間直定数生成演算子）になっているなど、いくつか誤記があります。…）。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3719638078215872130?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3719638078215872130/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3719638078215872130' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3719638078215872130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3719638078215872130'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafx-sdk.html' title='目覚まし時計プログラムをJavaFX SDK対応に書き換える'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_v58IVq86t4s/SJA2uChQlxI/AAAAAAAAACM/RYHecbFrPW8/s72-c/BlogSampleAlarmClock.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-2851465382204452242</id><published>2008-07-26T19:25:00.006+09:00</published><updated>2008-12-11T09:24:47.479+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>基本的なマウス入力の見本</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_v58IVq86t4s/SIsGUhAx3RI/AAAAAAAAACE/wIbG7wMWk-4/s1600-h/BlogSampleMouseInput%E7%94%BB%E9%9D%A2.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_v58IVq86t4s/SIsGUhAx3RI/AAAAAAAAACE/wIbG7wMWk-4/s320/BlogSampleMouseInput%E7%94%BB%E9%9D%A2.JPG" alt="" id="BLOGGER_PHOTO_ID_5227278742022380818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;同じく、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;NetBeans 6.1用JavaFX追加接続&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（Plugin）プログラムに付属している見本を参考に、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;基本的な&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;マウス入力応用&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の見本を作ってみました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;実行すると、図のように、マウス&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;指示器&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の座標と押されたマウス ボタンの番号（一番左のボタンが1。押されていないときは0）が、マウス指示器に追随して表示されます（それ用の画像取り込み用具を使っていないので、肝心のマウス&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;指示器&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の画像を取り込めていませんが、あしからず）。空色の矩形の中にマウスを移動すると、矩形が半透明で表示されます。&lt;br /&gt;次に、コードを示します。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;package deviceInput;&lt;br /&gt;&lt;br /&gt;import javafx.application.Frame;&lt;br /&gt;import javafx.application.Stage;&lt;br /&gt;import javafx.input.MouseEvent;&lt;br /&gt;import javafx.scene.Group;&lt;br /&gt;import javafx.scene.geometry.Rectangle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.scene.text.Text;&lt;br /&gt;import javafx.scene.text.TextOrigin;&lt;br /&gt;import javafx.scene.transform.Translate;&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt; var mouseEvent: MouseEvent;&lt;br /&gt; title: "Mouse Input"&lt;br /&gt; width: 400&lt;br /&gt; height: 332&lt;br /&gt; visible: true&lt;br /&gt; closeAction: function(): Void {&lt;br /&gt;   System.exit(0);&lt;br /&gt; }&lt;br /&gt; stage: Stage {&lt;br /&gt;   width: 400&lt;br /&gt;   height: 300&lt;br /&gt;   content: [&lt;br /&gt;     Rectangle {&lt;br /&gt;       x: 50, y: 50&lt;br /&gt;       width: 300, height: 200&lt;br /&gt;       fill: Color.LIGHTGRAY&lt;br /&gt;       onMousePressed: function(ev: MouseEvent): Void {&lt;br /&gt;         mouseEvent = ev;&lt;br /&gt;       }&lt;br /&gt;       onMouseClicked: function(ev: MouseEvent): Void {&lt;br /&gt;         mouseEvent = ev;&lt;br /&gt;       }&lt;br /&gt;       onMouseReleased: function(ev: MouseEvent): Void {&lt;br /&gt;         mouseEvent = ev;&lt;br /&gt;       }&lt;br /&gt;       onMouseMoved: function(ev: MouseEvent): Void {&lt;br /&gt;         mouseEvent = ev;&lt;br /&gt;       }           &lt;br /&gt;     },&lt;br /&gt;     Rectangle {&lt;br /&gt;       x: 150, y: 100&lt;br /&gt;       width: 100, height: 100&lt;br /&gt;       fill: Color.SKYBLUE&lt;br /&gt;       onMouseEntered: function(ev: MouseEvent): Void {&lt;br /&gt;         ev.node.opacity = 0.5;&lt;br /&gt;       }&lt;br /&gt;       onMouseExited: function(ev: MouseEvent): Void {&lt;br /&gt;         ev.node.opacity = 1.0;&lt;br /&gt;       }           &lt;br /&gt;     },&lt;br /&gt;     Group {&lt;br /&gt;       transform : Translate {x: bind mouseEvent.getX() + 20,&lt;br /&gt;           y: bind mouseEvent.getY()}&lt;br /&gt;       content : [&lt;br /&gt;         Text {&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: "StageX:"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateX: 45&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: bind "{mouseEvent.getStageX() as Integer}"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateX: 80&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: "StageY:"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateX: 125&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: bind "{mouseEvent.getStageY() as Integer}"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateY: 15&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: "X:"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateX: 15, translateY: 15&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: bind "{mouseEvent.getX() as Integer}"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateX: 50, translateY: 15&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: "Y:"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateX: 65, translateY: 15&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: bind "{mouseEvent.getY() as Integer}"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateY: 30&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: "Button:"&lt;br /&gt;         },&lt;br /&gt;         Text {&lt;br /&gt;           translateX: 40, translateY: 30&lt;br /&gt;           textOrigin: TextOrigin.TOP&lt;br /&gt;           fill: Color.RED&lt;br /&gt;           content: bind "{mouseEvent.getButton()}"&lt;br /&gt;         }&lt;br /&gt;       ]&lt;br /&gt;     }&lt;br /&gt;   ]       &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;マウス事象は、その&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;事象&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;が発生した図式の節（graph &lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;node&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。見本コードでは、Rectangleオブジェクトを使用している）の、事象&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;属性&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;onXxxYyy&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;）&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;に定義した呼び戻し&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;関数を用いて取得します。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;マウス事象から、マウスの座標やボタン開閉器の番号などの情報が得られます。詳しいことは、&lt;span style="font-family:lucida grande;"&gt;「&lt;a href="http://openjfx.java.sun.com/current-build/doc/api/index.html"&gt;JavaFX API&lt;/a&gt;」&lt;/span&gt;を参照してください。&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;なお、図からもわかりますが、現状（2008/07/23現在の日々構築版追加接続プログラム）では、入力される座標に、一部不具合があるようです。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;マウス事象が発生した節の原点に対する相対位置&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を返す関数getX()/getY()は、その節を含むStageの原点に関する相対位置を返すgetStageX()/getStageY()と同じ値を返してしまいます（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;画面上の絶対位置を返す&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;getScreenX()/getScreenY()は、正常に機能しています）。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-2851465382204452242?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/2851465382204452242/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=2851465382204452242' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2851465382204452242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2851465382204452242'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/blog-post_26.html' title='基本的なマウス入力の見本'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_v58IVq86t4s/SIsGUhAx3RI/AAAAAAAAACE/wIbG7wMWk-4/s72-c/BlogSampleMouseInput%E7%94%BB%E9%9D%A2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-327788067541985816</id><published>2008-07-19T20:04:00.020+09:00</published><updated>2008-12-11T09:24:47.657+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>基本的な動画の見本</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_v58IVq86t4s/SIHOl7dSbDI/AAAAAAAAAB8/8trztnjpetA/s1600-h/BlogSampleBasicMotion.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_v58IVq86t4s/SIHOl7dSbDI/AAAAAAAAAB8/8trztnjpetA/s320/BlogSampleBasicMotion.JPG" alt="" id="BLOGGER_PHOTO_ID_5224684193737501746" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;NetBeans 6.1用JavaFX追加接続&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（Plugin）プログラムに付属している見本を参考に、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;基本的な&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;動画応用&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の見本を作ってみました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;実行すると、図のような円が色を変えながら左右に往復運動します。&lt;br /&gt;次に、コードを示します。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;package motionPicture;&lt;br /&gt;&lt;br /&gt;import javafx.animation.KeyFrame;&lt;br /&gt;import javafx.animation.Timeline;&lt;br /&gt;import javafx.application.Frame;&lt;br /&gt;import javafx.application.Stage;&lt;br /&gt;import javafx.scene.geometry.Circle;&lt;br /&gt;import javafx.scene.paint.Color;&lt;br /&gt;import javafx.scene.text.Text;&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var x: Integer = 50;&lt;br /&gt;var vx: Integer = 1;&lt;br /&gt;var color: Color = Color.rgb(25, 50, 0);&lt;br /&gt;&lt;br /&gt;var timeline: Timeline = Timeline {&lt;br /&gt;  repeatCount: Timeline.INDEFINITE&lt;br /&gt;  keyFrames:&lt;br /&gt;    KeyFrame {&lt;br /&gt;      time: 10ms&lt;br /&gt;      action: function(): Void {&lt;br /&gt;        x += vx;&lt;br /&gt;        color = Color.rgb((x / 2), x, 0);&lt;br /&gt;        if (x &amp;lt; 50) {&lt;br /&gt;          vx = 1;&lt;br /&gt;        } else if (x &gt; 250) {&lt;br /&gt;          vx = -1;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;timeline.start();&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;  title: "Basic Motion"&lt;br /&gt;  width: 310&lt;br /&gt;  height: 130&lt;br /&gt;  visible: true&lt;br /&gt;  closeAction: function(): Void {&lt;br /&gt;    System.exit(0);&lt;br /&gt;  }&lt;br /&gt;  stage: Stage {&lt;br /&gt;    fill: Color.LIGHTGRAY&lt;br /&gt;    content: Circle {&lt;br /&gt;      centerX: bind x, centerY: 50, radius: 30&lt;br /&gt;      fill: bind color&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;動画は、前はdur演算子を用いて実現していましたが、JavaFX SDKでは、javafx.animation.Timelineクラスの機能を利用します。&lt;br /&gt;repeatCount属性には、動画の繰り返し回数を、0以上の整数で指定します。無限に繰り返すときは、上記のように、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Timeline.INDEFINITEを指定します。&lt;br /&gt;keyFrames属性には、KeyFrameの列を指定します。&lt;br /&gt;そして、start()関数を呼び出すと、動画が開始します。&lt;br /&gt;また、各KeyFrameのtime属性には、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Timelineの1周期における相対時刻を指定します。&lt;br /&gt;action属性には、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Timelineの各周期&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;で、time属性で指定した時間が経過したときに呼び出される関数を指定します。上記の例では、無名関数で動画処理を定義しています。&lt;br /&gt;以上が、基本的な動画の記述方法の例です。&lt;br /&gt;最後に、ご注意を一言。本当は、枠付き窓の表題は（「Basic Motion」ではなく）日本語で表示したかったのですが、私が利用している、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;2008/07/16現在の日々構築版&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;追加接続&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;プログラムでは日本語表示ができません&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;、（標準出力へも表示できません）&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。「MS932にマップできない」旨の誤り通報文が表示されて構築できなかったり、構築には成功しても、表示は文字化けを起こします&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。&lt;br /&gt;Javaのプログラムからは問題なく日本語表示できるので、JavaFX追加接続プログラムに関連した問題と思われますが、原因は不明です（追加接続プログラム自体の問題なのか、設定上の問題なのかも分かりません）。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-327788067541985816?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/327788067541985816/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=327788067541985816' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/327788067541985816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/327788067541985816'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/blog-post.html' title='基本的な動画の見本'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_v58IVq86t4s/SIHOl7dSbDI/AAAAAAAAAB8/8trztnjpetA/s72-c/BlogSampleBasicMotion.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4445423121035521024</id><published>2008-07-17T19:52:00.003+09:00</published><updated>2008-07-17T21:19:41.957+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX追加接続プログラム'/><title type='text'>NetBeans 6.1用JavaFX追加接続プログラムの更新</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;最近のJavaFXについては、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;「&lt;a href="http://openjfx.java.sun.com/current-build/doc/reference/JavaFX-Language.html"&gt;The JavaFX™ Script Programming Language Reference  (Draft)&lt;/a&gt;」&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;が公開されていることを、以前の&lt;a href="http://terrasweblog.blogspot.com/2008/06/javafx1.html"&gt;投稿&lt;/a&gt;でご紹介しました。それと一緒に、「&lt;a href="http://openjfx.java.sun.com/current-build/doc/api/index.html"&gt;JavaFX API&lt;/a&gt;」も最新のものが公開されています。&lt;br /&gt;ただ、このAPI文書はJavaFX SDKに対応したものなので、「The JavaFX™ Script Programming Language Reference (Draft)」文書のコード例で引用されている&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;javafx.guiパッケージなどは、もう載っていません。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;私は、NetBeans 6.1にJavaFX追加接続&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;（Plugin）&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラム（2008/06/15現在の日々構築版）を追加導入して使っていたのですが、導入時点では、JavaFX SDKには対応していませんでした。最近紹介される見本プログラムは&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JavaFX SDKに対応したものになっていますので&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;、この機会に、最新の&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;追加接続プログラムに更新することにしました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;（NetBeans&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt; 6.1とその&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JavaFX追加接続&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;の導入をお考えの方は、、「&lt;a href="http://javafx.netbeans.org/download-compiler-JFXplugin.html"&gt;Downloading and Installing a Developmental Build of JavaFX Script Plugin for NetBeans IDE 6.1&lt;/a&gt;」が参考になります。ただし、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JDK&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;は、（JDK 5ではなく）JDK 6を導入しておいたほうが良いかも知れません。以前の&lt;a href="http://terrasweblog.blogspot.com/2008/02/javafx_02.html"&gt;投稿&lt;/a&gt;でも記しましたが、JDK 5では一括変換済みコードが実行できないことがありました。少なくとも、私自身は&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JDK 5で動作させたことはありません&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;）&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;最新の追加接続&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;（2008/07/16現在の日々構築版）&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;を入手し、以前行った手順と同じようにして&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;追加接続&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;を更新しようとしたのですが、パソコンに取り込み済みの&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;追加接続&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;の更新方法が分かりません（NetBeansにあまり習熟していないので）。しかたなく、すでに導入済みの&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;追加接続&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラム&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;を取り外してから、改めて最新版を導入しなおすことにしました。&lt;br /&gt;更新が済み、NetBeansを再起動すると、作成済みの企画（Project）の名称が朱字で表示され、「参照の問題を解決せよ」なる旨の通報窓が表示されます。指示されように、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;基盤（Platform）環境に&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JavaFX SDK（私の環境では、選択肢に「JavaFX SDK #1」がありましたので、それ）を追加すると、企画名が元の黒字表示に戻り、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;「参照の問題」が解決したようです&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;。&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4445423121035521024?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4445423121035521024/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4445423121035521024' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4445423121035521024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4445423121035521024'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/netbeans-61javafx.html' title='NetBeans 6.1用JavaFX追加接続プログラムの更新'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-7216917944464645481</id><published>2008-07-05T22:14:00.001+09:00</published><updated>2008-07-05T22:18:30.946+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：付録A</title><content type='html'>A.鍵語と予約語&lt;br /&gt;この付録は、JavaFX™台本型プログラミング言語において予約された単語を記録したものである。&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;表A.1  鍵語と予約語&lt;br /&gt;実装済み鍵語&lt;br /&gt;abstract   attribute  bind  break&lt;br /&gt;class  continue  delete  false  for&lt;br /&gt;function  if  import  init  insert&lt;br /&gt; new  not  null  package&lt;br /&gt;private   public   return&lt;br /&gt;super  sizeof  static  this  throw&lt;br /&gt;try  true  var  while  after&lt;br /&gt;and  as  before   catch&lt;br /&gt; dur  else  exclusive  extends&lt;br /&gt;finally    in  bound&lt;br /&gt;indexof  into  inverse  lazy &lt;br /&gt;on  or  replace  step &lt;br /&gt;with  where  instanceof  override  at&lt;br /&gt;then  tween       &lt;br /&gt;&lt;br /&gt;予約済み鍵語&lt;br /&gt;assert  by  do  first  from&lt;br /&gt;last  let  protected  readonly  typeof&lt;br /&gt;lazy          &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-7216917944464645481?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/7216917944464645481/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=7216917944464645481' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7216917944464645481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7216917944464645481'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafxa.html' title='JavaFX台本型プログラミング言語基準（草案）：付録A'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-6335241541396458845</id><published>2008-07-05T21:34:00.003+09:00</published><updated>2008-07-05T21:56:32.728+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第9章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;9.引き金&lt;br /&gt;9.1  置換引き金&lt;br /&gt;置換引き金に対する構文は次のとおりである。&lt;br /&gt;&lt;br /&gt;"on" "replace"&lt;br /&gt;   [旧値]&lt;br /&gt;   [ "[" 最低索引値 ".." 最高索引値 "]" "=" 新要素 ]&lt;br /&gt;   区画&lt;br /&gt;&lt;br /&gt;置換引き金は、引き金を取り付けた変数に対するすべての変更に続いて呼び出される。構文上の非終端子である旧値、最低索引値、最高索引値、および新要素は、その本体が区画であるところの関数に対する、事実上の仮引数である。&lt;br /&gt;・旧値は変数の事前の値であり、変数と同じ型を持つ。&lt;br /&gt;・最低索引値と最高索引値は、旧値において置換対象となる部分の範囲を区切る。それらの型はIntegerである。純然たる挿入に対しては、「最高索引値==最低索引値-1」である。&lt;br /&gt;・新要素は、部分列「旧値[最低索引値..最高索引値]」を置き換える値の列である。その型は変数と同じである。&lt;br /&gt;引数「[最低索引値..最高索引値]=新要素」は、引き金が取り付けられた変数が列型であるときのみ認められる。&lt;br /&gt;旧値と新要素は非対称であることに留意せよ。すなわち、旧値は、引き金が取り付けられた変数の事前の値であるのに対し、新要素は、その変数で変更される要素のみを含んでいる新値の部分列であるということである。&lt;br /&gt;置換引金の構文は、部分列の割り当てを思い起こさせるようになっている。次を想定する。&lt;br /&gt;&lt;br /&gt;attribute x&lt;br /&gt;   on replace oldVal[lo..hi]=newVals { exp };&lt;br /&gt; var save = x;&lt;br /&gt; x[i..j] = y;&lt;br /&gt;&lt;br /&gt;すると、oldVal はsaveに、loはiに、hiはjに、そしてnewValsはyに結びつけられた上で、expが評価される。&lt;br /&gt;統合置換引き金は、部分列の割り当てとうまく機能する。たとえば、次のように結合を定義することができる。&lt;br /&gt;&lt;br /&gt;attribute x;&lt;br /&gt;attribute y = bind x;&lt;br /&gt;&lt;br /&gt;これは次と等価である。&lt;br /&gt;&lt;br /&gt;attribute x =&lt;br /&gt;   on replace [i..j]=n&lt;br /&gt;   { y[i..j]=n };&lt;br /&gt;attribute y = [];&lt;br /&gt;&lt;br /&gt;次のように、yがxの写像だとする。&lt;br /&gt;&lt;br /&gt;attribute x;&lt;br /&gt;attribute y = bind for (xi in x) f(xi);&lt;br /&gt;&lt;br /&gt;これは次と等価である。&lt;br /&gt;&lt;br /&gt;attribute x =&lt;br /&gt;   on replace [i..j]=n&lt;br /&gt;   { y[i..j] = for (k in n) f(k) };&lt;br /&gt;attribute y = [];&lt;br /&gt;&lt;br /&gt;列の要素のある範囲を削除または置換すること、もしくは列を一箇所に挿入することは、すべて単一の引き金呼び出しに帰着する。述語条件を満たすすべての要素の削除のような、別の演算のあるものは、複数の引き金呼び出しに分解できるかもしれない。In that case the state as seen by each trigger invocation is consistent in the sense that the programmer-visible state is as if the predicate-delete (for example) were implemented as a set of independent slice-delete operations.&lt;br /&gt;&lt;br /&gt;陳謝：最後の文は、拙には何が言いたいのか判然としないため、原文のまま載せておきます。&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;m(_ _；)m&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-6335241541396458845?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/6335241541396458845/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=6335241541396458845' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6335241541396458845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6335241541396458845'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafx9.html' title='JavaFX台本型プログラミング言語基準（草案）：第9章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-80561240530824224</id><published>2008-07-04T21:39:00.001+09:00</published><updated>2008-07-04T22:03:03.706+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第8章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;8.データ結合&lt;br /&gt;bind鍵語は、対象となる変数の値を別の変数の値に結びつける。&lt;br /&gt;&lt;br /&gt;let x = bind someExpression;&lt;br /&gt;&lt;br /&gt;これは、someExpressionの結果を変数xに結びつける。someExpressionの値が変わると、xの値も自動的に更新される。結び付けられる変数は、ある基本データ型の単純な値、式の結果、区画式の結果または結合関数でもよい（let鍵語は、それらに割り当てることができない変数を導入する）。&lt;br /&gt;&lt;br /&gt;8.1  再計算して更新する&lt;br /&gt;ある状況では、更新がどのように行われるか、あるいは結び付けられる値が変化するということはどういう意味なのかを厳密に知っている必要ある。結び付けられる値が変化すると、最小限の再計算が実行される。このことは、ある限られた状況において重要となる。たとえば、オブジェクトの生成を必要とする結合が実行される場合で、オブジェクトの同一性の理由から、新たなオブジェクトが実際に生成されるか否かが問題となるような状況である。&lt;br /&gt;&lt;br /&gt;let sum = bind expr1 + expr2;&lt;br /&gt;&lt;br /&gt;（上記の例で、）expr2が変化するとsumは再計算されるが、expr1は再計算されない。expr1に対する値はすでに格納されており、単にその値を再度取ってくるだけである。&lt;br /&gt;&lt;br /&gt;次に実例を示す。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var y = 3;&lt;br /&gt;function ten() : Integer { 10 }&lt;br /&gt;let sum = bind ten() + y;&lt;br /&gt;System.out.println(sum);&lt;br /&gt;y = 7;&lt;br /&gt;System.out.println(sum);&lt;br /&gt;&lt;br /&gt;このプログラムの出力は次のようになる。&lt;br /&gt;&lt;br /&gt;13&lt;br /&gt;17&lt;br /&gt;&lt;br /&gt;yが7に設定されたとき、関数ten()は変化していないので再度呼び出されることはない。関数値は記憶されており再利用される。&lt;br /&gt;&lt;br /&gt;8.2  結合と区画式&lt;br /&gt;結合において、区画式の中に存在しうるのは変数宣言文だけである。（1増および1減を含め）値の割り当ては禁止されていることに留意せよ。したがって、結合区画式は次のような形式を取る。&lt;br /&gt;&lt;br /&gt;bind { var a = expr; var b = expr; var c = expr; expr }&lt;br /&gt;&lt;br /&gt;結合された式に対するいかなる変化も更新を引き起こし、その更新は最小限なので、変数が有効的に結合されていることを確認するのは容易である。while、insertおよびdeleteは文なので、結合の中に現れてはならないことに留意せよ。&lt;br /&gt;&lt;br /&gt;8.3  結合と条件式&lt;br /&gt;次の例を考えてみよ。&lt;br /&gt;&lt;br /&gt;let x = bind if (condExpr) expr1 else expr2;&lt;br /&gt;&lt;br /&gt;condExprが変わると、if文のどちらの分岐が評価されるのかも変わる。expr1またはexpr2に対する変化は、どちらも、もう一方の式の再計算を引き起こすことはない。&lt;br /&gt;&lt;br /&gt;8.4  結合とfor式&lt;br /&gt;次の例を考えてみよ。&lt;br /&gt;&lt;br /&gt;let newSeq = bind for (elem in seq) expr;&lt;br /&gt;&lt;br /&gt;たとえseqが変わっても、依然としてseqに存在し続けている要素に対応するnewSeqの要素は、再計算されない。言い換えれば、要素がseqに挿入されると、その要素にexprを適用した結果がnewSeqの相当する位置に挿入され、newSeqの他の要素は再計算されない。&lt;br /&gt;例外は、exprがindexof elemを使用しているために、索引の値が変化した要素を更新する必要がある場合であるが、最小限の更新という既定には合致している。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var min = 0;&lt;br /&gt;var max = 3;&lt;br /&gt;function square(x : Integer) : Integer { x*x }&lt;br /&gt;let values = bind for (x in [min..max]) square(x);&lt;br /&gt;System.out.println(values);&lt;br /&gt;max = 5;&lt;br /&gt;System.out.println(values);&lt;br /&gt;min = 1;&lt;br /&gt;System.out.println(values);&lt;br /&gt;min = 0;&lt;br /&gt;System.out.println(values);&lt;br /&gt;&lt;br /&gt;この場合、次の再計算が実行される。&lt;br /&gt;・0から3の2&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;乗&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を計算する。&lt;br /&gt;・4と5の2乗を計算する（maxが変わっても、0から3の2&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;乗&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;は再計算されない）。&lt;br /&gt;・ほかの値は再計算せず、0の2&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;乗&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を削除する。&lt;br /&gt;・0の2条を戻す。これは、その値の再計算を必要とする。この動作は、代わりにinsertやdeleteを用いても同様である。&lt;br /&gt;&lt;br /&gt;8.5  結合とオブジェクト直定数&lt;br /&gt;オブジェクト直定数は、演算子や非結合関数のように機能する。オブジェクト直定数の引数の一つが変化すると、オブジェクト直定数は再実行（新たな実体が生成）される。&lt;br /&gt;&lt;br /&gt;let pt = bind Point { x: myX  y: myY  }&lt;br /&gt;&lt;br /&gt;myXが変わると、JavaFX台本型プログラミング言語は、新たなPointオブジェクトを生成する。これは、不変オブジェクトに対して予期された振る舞いでもある。&lt;br /&gt;新たなオブジェクトを生成せずに、xの値がmyXの値を追跡するようにするためには、結合が必要になる。&lt;br /&gt;&lt;br /&gt;let pt = bind Point { x: bind myX  y: myY  }&lt;br /&gt;&lt;br /&gt;この例に対しては、おそらくyも同様に結合した方が良いだろう。&lt;br /&gt;&lt;br /&gt;let pt = bind Point { x: bind myX  y: bind myY  }&lt;br /&gt;&lt;br /&gt;ここで、ptは常に同じPointオブジェクトの実体と結合したままである。それは、冒頭のbindがなくても同様である。&lt;br /&gt;&lt;br /&gt;let pt = Point { x: bind myX  y: bind myY  }&lt;br /&gt;&lt;br /&gt;8.6  結合と関数&lt;br /&gt;非結合関数は、bound鍵語が前置されていない関数である。Javaプログラミング言語の操作やJavaFX台本型プログラミング言語の関数の呼び出しに関して、その引数のいずれかが変更されると、JavaFX台本型プログラミング言語はその関数を再度呼び出すが、関数の本体は暗箱である。関数が、その入力となる引数以外に持っている依存性のゆえに再計算されることはない。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;class Point {&lt;br /&gt;    attribute x : Number;&lt;br /&gt;    attribute y : Number;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var scale = 1.0;&lt;br /&gt;&lt;br /&gt;function makePoint(x0 : Number, y0 : Number) : Point {&lt;br /&gt;    Point {&lt;br /&gt;         x: x0 * scale&lt;br /&gt;         y: y0 * scale&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var myX = 3.0;&lt;br /&gt;var myY = 3.0;&lt;br /&gt;let pt = bind makePoint(myX, myY);&lt;br /&gt;System.out.println(pt.x);&lt;br /&gt;myX = 10.0;&lt;br /&gt;System.out.println(pt.x);&lt;br /&gt;scale = 2.0;&lt;br /&gt;System.out.println(pt.x);&lt;br /&gt;&lt;br /&gt;出力。&lt;br /&gt;&lt;br /&gt;3.0&lt;br /&gt;10.0&lt;br /&gt;10.0&lt;br /&gt;&lt;br /&gt;引数myXを変更すると、関数makePointは再度呼び出される。しかし、関数makePointは暗箱である。よって、scaleに割り当てられた値が変更されても、当然ではあろうが、関数は再計算されない。これこそが、結合関数が役立つことを意図された場面である。結合関数が予期された更新をもたらしてくれる。&lt;br /&gt;結合関数は、その本体として、結合される区画式を持っている（それゆえに、結合区画式に関する上述の制限を有している）。結合関数に結びつけると、引数以外の変化も更新を引き起こし、かつ引数の変更も調べられる。上述の関数makePointを結合関数にすると次のようになる。&lt;br /&gt;&lt;br /&gt;bound function makePoint(x0 : Number, y0 : Number) : Point {&lt;br /&gt;&lt;br /&gt;今度こそ、scaleに割り当てられた値の変化は更新（20.0）を引き起こす。myXが変わるとx0 * scaleだけが再計算され、y0 * scaleは再計算されないことに留意せよ。&lt;br /&gt;結合とは別のところで結合関数を呼び出すことは、非結合関数を呼び出すことと同じことである。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-80561240530824224?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/80561240530824224/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=80561240530824224' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/80561240530824224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/80561240530824224'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafx8.html' title='JavaFX台本型プログラミング言語基準（草案）：第8章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1809918184971800561</id><published>2008-07-03T17:17:00.006+09:00</published><updated>2008-07-03T20:54:13.469+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第7章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;7.列内包&lt;br /&gt;7.1  forを用いた列の繰り返し&lt;br /&gt;JavaFX台本型プログラミング言語は、for演算子を用いた列内包を支援する。列内包は、1つ以上の入力列、任意選択としてのろ過器、および式から構成される。各入力列は、変数と関連している。列内包の結果は、元となる列の要素の内でろ過器の条件を満たすものの組合せに、式を適用したものからなる新たな列である。&lt;br /&gt;次のプログラムはこの構文の実例を示したもので、曲集の一覧から曲の一部が表題となっているものを特定するためにfor演算子を用いている。&lt;br /&gt;&lt;br /&gt;class Album {&lt;br /&gt;attribute title: String;&lt;br /&gt;attribute artist: String;&lt;br /&gt;attribute tracks: String[];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var albums =&lt;br /&gt;[Album {&lt;br /&gt;     title: "A Hard Day's Night"&lt;br /&gt;     artist: "The Beatles"&lt;br /&gt;     tracks:&lt;br /&gt;          ["A Hard Day's Night",&lt;br /&gt;           "I Should Have Known Better",&lt;br /&gt;           "If I Fell",&lt;br /&gt;           "I'm Happy Just To Dance With You",&lt;br /&gt;           "And I Love Her",&lt;br /&gt;           "Tell Me Why",&lt;br /&gt;           "Can't Buy Me Love",&lt;br /&gt;           "Any Time At All",&lt;br /&gt;           "I'll Cry Instead",&lt;br /&gt;           "Things We Said Today",&lt;br /&gt;           "When I Get Home",&lt;br /&gt;           "You Can't Do That"]&lt;br /&gt;},&lt;br /&gt;Album {&lt;br /&gt;     title: "Circle Of Love"&lt;br /&gt;     artist: "Steve Miller Band"&lt;br /&gt;     tracks:&lt;br /&gt;          ["Heart Like A Wheel",&lt;br /&gt;           "Get On Home",&lt;br /&gt;           "Baby Wanna Dance",&lt;br /&gt;           "Circle Of Love",&lt;br /&gt;           "Macho City"]&lt;br /&gt;}];&lt;br /&gt;&lt;br /&gt;for (album in albums, track in album.tracks)  {&lt;br /&gt;if (album.title == track)&lt;br /&gt;   java.lang.System.out.println("TITLE TRACK = {track}")&lt;br /&gt;else&lt;br /&gt;   java.lang.System.out.println("Track = {track}")&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;出力：&lt;br /&gt;&lt;br /&gt;TITLE TRACK = A Hard Day's Night&lt;br /&gt;Track = I Should Have Known Better&lt;br /&gt;Track = If I Fell&lt;br /&gt;Track = I'm Happy Just To Dance With You&lt;br /&gt;Track = And I Love Her&lt;br /&gt;Track = Tell Me Why&lt;br /&gt;Track = Can't Buy Me Love&lt;br /&gt;Track = Any Time At All&lt;br /&gt;Track = I'll Cry Instead&lt;br /&gt;Track = Things We Said Today&lt;br /&gt;Track = When I Get Home&lt;br /&gt;Track = You Can't Do That&lt;br /&gt;Track = Heart Like A Wheel&lt;br /&gt;Track = Get On Home&lt;br /&gt;Track = Baby Wanna Dance&lt;br /&gt;TITLE TRACK = Circle Of Love&lt;br /&gt;Track = Macho City&lt;br /&gt;&lt;br /&gt;次に示すのは、ろ過器を用いた別の例である。これは、数を受け取ってその因数の一覧を返す関数を定義したものである。&lt;br /&gt;&lt;br /&gt;function factors(n:Number) {&lt;br /&gt;return for (i in [1 .. n/2] where n % i == 0) i;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;訳注：&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;この例では、:&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Number型の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「因数」の列を&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;戻すので、正確には「因数」とは呼べないが…。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;forに対する内包の中で、indexof演算子を使用することができる。その構文は「indexof 名称」で、名称は繰り返し変数の名前である。その値は、基となる列における繰り返しの索引の値である。&lt;br /&gt;次の例に示したように、indexof演算子は列の抽出に使用することもできる。&lt;br /&gt;&lt;br /&gt;var nums = [1..5];&lt;br /&gt;var numsExceptTheFirstTwo = nums[n|indexof n &gt; 1]; // [ 3, 4, 5 ]を返す&lt;br /&gt;&lt;br /&gt;7.2  列変数の変更&lt;br /&gt;insertは、列に新たな要素を挿入する。&lt;br /&gt;&lt;br /&gt;insert x into seq&lt;br /&gt;insert x before seq[idx]&lt;br /&gt;insert x after seq[idx]&lt;br /&gt;&lt;br /&gt;deleteは、列から要素を取り除く。&lt;br /&gt;&lt;br /&gt;delete seq&lt;br /&gt;delete x from seq&lt;br /&gt;delete seq[idx]&lt;br /&gt;delete seq[a..b]&lt;br /&gt;&lt;br /&gt;次のコードは、それぞれの例である。&lt;br /&gt;&lt;br /&gt;// 挿入の例&lt;br /&gt;&lt;br /&gt;var nums = [1..5];&lt;br /&gt;var x = 6;&lt;br /&gt;insert x into nums; // 結果は、[ 1, 2, 3, 4, 5, 6 ]&lt;br /&gt;x++;&lt;br /&gt;insert x before nums[0]; // 結果は、[ 7, 1, 2, 3, 4, 5, 6 ]&lt;br /&gt;x++;&lt;br /&gt;insert x after nums[3]; // 結果は、[ 7, 1, 2, 3, 8, 4, 5, 6 ]&lt;br /&gt;&lt;br /&gt;// 削除の例&lt;br /&gt;&lt;br /&gt;nums = [1..5];&lt;br /&gt;delete 2 from nums; // 結果は、[ 1, 3, 4, 5 ]&lt;br /&gt;delete nums[0];// 結果は、[ 3, 4, 5 ]&lt;br /&gt;nums = [1..10]; // 結果は、[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]&lt;br /&gt;delete nums[3..7]; // 結果は、[ 1, 2, 3, 9, 10 ]&lt;br /&gt;delete nums; // 結果は、[ ]&lt;br /&gt;nums = [1..10];&lt;br /&gt;delete nums[5..]; // 結果は、[ 1, 2, 3, 4, 5 ]&lt;br /&gt;delete nums[0..&amp;lt;]; // 結果は、[ 5 ]&lt;br /&gt;&lt;br /&gt;訳注：原文では、最後の「delete nums[0..&amp;lt;];」文が「delete nums[0..&gt;];」と誤記されている。&lt;br /&gt;&lt;br /&gt;列の要素を逆順に並べ替えることもできる。&lt;br /&gt;&lt;br /&gt;var nums = [1..5];&lt;br /&gt;reverse nums; // [ 5, 4, 3, 2, 1 ]を返す&lt;br /&gt;&lt;br /&gt;訳注：2008年6月15日時点のNetBeans 6.1用JavaFX追加接続（Plugin）プログラムで動作確認したところ、「reverse nums;」だけでは、元のnums の要素の並びは変わらなかった（並び替えた結果を利用するためには、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;nums = &lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;reverse nums;」&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;のように列変数に代入しなおす必要がある。その意味では、delete演算子とは用法が異なる）。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1809918184971800561?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1809918184971800561/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1809918184971800561' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1809918184971800561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1809918184971800561'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafx7.html' title='JavaFX台本型プログラミング言語基準（草案）：第7章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-275174570950162061</id><published>2008-07-03T13:56:00.001+09:00</published><updated>2008-07-03T14:01:55.209+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第6章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;6.列&lt;br /&gt;先に述べた5つの基本データ型に加え、JavaFX台本型プログラミング言語は、列として知られたデータ構造を提供する。列はJavaプログラミング言語の配列に似ているが、異なる点もある。&lt;br /&gt;次のコードはある例を示す。&lt;br /&gt;&lt;br /&gt;var weekDays = ["Mon","Tue","Wed","Thur","Fri"];&lt;br /&gt;var days = [weekDays, ["Sat","Sun"]];&lt;br /&gt;&lt;br /&gt;列は、オブジェクトの順序付けられた一覧を表す。しかしながら、列そのものはオブジェクトではないため、入れ子構造を取ることはできない。列は、値により等価であるとみなされる。すなわち、列の長さが等しく、それらの要素が同一であるとき、列は等しくなる。（上記のdaysの初期化におけるように）入れ子になった列を形成する式は、自動的に平準化される。&lt;br /&gt;&lt;br /&gt;days == ["Mon","Tue","Wed","Thur","Fri","Sat","Sun"]; // trueを返す&lt;br /&gt;&lt;br /&gt;さらに、単一のオブジェクトは、1つのオブジェクトからなる列に等価である。&lt;br /&gt;&lt;br /&gt;1 == [1]; // trueを返す&lt;br /&gt;&lt;br /&gt;列の型は、「[]」注釈を用いて宣言される。&lt;br /&gt;&lt;br /&gt;var xs:Number[]; // 数の列&lt;br /&gt;var strs:String[]; // 文字列の列&lt;br /&gt;&lt;br /&gt;列の要素は共通の型を持たねばならず、その型はオブジェクトであっても良い。列は、Javaプログラミング言語の配列のように、索引付けることがきる。&lt;br /&gt;&lt;br /&gt;var wednesday = days[2];&lt;br /&gt;&lt;br /&gt;次のように、その要素が等差数列をなしている列のための、「..」を用いた簡便な表記法もある。&lt;br /&gt;&lt;br /&gt;var nums = [1..100];&lt;br /&gt;&lt;br /&gt;この簡略記法により、各要素を手入力する必要がなくなる。&lt;br /&gt;[]演算子は、述語形式の選択も表す。述語は、次の形式を取る。&lt;br /&gt;&lt;br /&gt;列[変数名| 論理式]&lt;br /&gt;&lt;br /&gt;例：&lt;br /&gt;&lt;br /&gt;var nums = [1,2,3,4];&lt;br /&gt;var numsGreaterThanTwo = nums[n|n &gt; 2];&lt;br /&gt;&lt;br /&gt;上記の式は、元の列の要素の内、述部の条件を満たすものから構成された新たな列を返す。&lt;br /&gt;最後に、部分列は、列の一部を利用できるようにする。&lt;br /&gt;&lt;br /&gt;seq[a..b]  // 索引aとbの間（両端含む）の列&lt;br /&gt;seq[a..&amp;lt;b] // 索引a（含む）とb（含まない）の間の列&lt;br /&gt;seq[a..]  // seq[a..&amp;lt;sizeof seq]に同じ&lt;br /&gt;seq[a..&amp;lt;] // 一貫性を保つため、seq[a..&amp;lt;sizeof seq-1] に同じ&lt;br /&gt;&lt;br /&gt;列や部分列を、利用および／または変更するいくつもの異なる方法がある。次の章では、JavaFX台本型プログラミング言語の一覧内包の特徴について探求する。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-275174570950162061?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/275174570950162061/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=275174570950162061' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/275174570950162061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/275174570950162061'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafx6.html' title='JavaFX台本型プログラミング言語基準（草案）：第6章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-8959234662634500467</id><published>2008-07-02T21:02:00.006+09:00</published><updated>2008-07-03T12:03:30.820+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第5章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;5.式、文、および演算子&lt;br /&gt;5.1  式&lt;br /&gt;Javaプログラミング言語と異なり、JavaFX台本型プログラミング言語は式言語である。すべての実行文は、0個以上の入力とそれに続く単一の出力から構成される式である。これには、条件、繰り返し、ならびにコード区画さえも含まれる。&lt;br /&gt;次に実例を示す。&lt;br /&gt;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var rand = (Math.random() * 100).intValue();&lt;br /&gt;var s:String = null;&lt;br /&gt;if (rand % 2 == 0) {&lt;br /&gt;s = "rand is even"&lt;br /&gt;} else {&lt;br /&gt;s = "rand is odd"&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;System.out.println(s);&lt;br /&gt;&lt;br /&gt;上記の例で、条件式ifのthen節とelse節は、それ自体が式、すなわち区画式である。&lt;br /&gt;&lt;br /&gt;5.2  区画式&lt;br /&gt;区画式は、中括弧（{}）で囲まれた、セミコロン（;）区切り文（宣言または式でもよい）の一覧から構成される。（区画内の）最後の文が式なら、その式の値が区画式の値となる。さもなければ、区画式はvoid型となる。&lt;br /&gt;したがって、先の例は次のように書くこともできる。&lt;br /&gt;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var rand = (Math.random() * 100).intValue();&lt;br /&gt;var s:String =&lt;br /&gt;if (rand % 2 == 0) {&lt;br /&gt;"rand is even";&lt;br /&gt;} else {&lt;br /&gt;"rand is odd";&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;System.out.println(s);&lt;br /&gt;&lt;br /&gt;あるいは、（次のように）中括弧を省略することができる。&lt;br /&gt;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var rand = (Math.random() * 100).intValue();&lt;br /&gt;var s:String = if (rand % 2 == 0) "rand is even" else "rand is odd";&lt;br /&gt;&lt;br /&gt;System.out.println(s);&lt;br /&gt;&lt;br /&gt;Javaプログラミング言語は、if文と条件式「a &amp;lt; b ? a : b」の両方を持っている。 区画式のおかげで、JavaFX台本型プログラミング言語のif式は、両者の代わりをしている。&lt;br /&gt;&lt;br /&gt;5.3  値域式&lt;br /&gt;値域式は、次の構文により、等差数列を形成している数値の列を定める。&lt;br /&gt;&lt;br /&gt;[数1..数2]&lt;br /&gt;&lt;br /&gt;値域式は、数1から数2までの整数（両端含む）からなる列を定める。 値域式の簡単な例として、次のようなものが考えられる。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var nums = [0..3];&lt;br /&gt;System.out.println(nums == [0,1,2,3]); // trueと表示する&lt;br /&gt;&lt;br /&gt;既定では数値間の間隔は1だが、異なる値を指定することもできる。たとえば、次の式は、1から10の間の奇数からなる列を定める。&lt;br /&gt;&lt;br /&gt;[1..10 step 2]&lt;br /&gt;&lt;br /&gt;降順の値域を生成するためは、2つ目の値が1つ目の値より小さいことを確認し、負数の間隔を指定する。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;var nums = [3..0 step -1];&lt;br /&gt;System.out.println(nums == [3,2,1,0]); // trueと表示する&lt;br /&gt;&lt;br /&gt;次の宣言文は、実際には空の列を宣言することに留意せよ。&lt;br /&gt;&lt;br /&gt;var nums1 = [3..0 ];&lt;br /&gt;var nums2 = [3..0 step 1];&lt;br /&gt;&lt;br /&gt;5.4  条件式&lt;br /&gt;if式は、else節がさらなるif式でない限りthen節とelse節を囲む中括弧が常に必要であるという点を除いて、Java™プログラミング言語における表現と似ている。&lt;br /&gt;&lt;br /&gt;if (condition1) { &lt;br /&gt;System.out.println("Condition 1");&lt;br /&gt;} else if (condition2) { &lt;br /&gt;System.out.println("Condition2");&lt;br /&gt;} else { &lt;br /&gt;System.out.println("not Condition 1 or Condition 2");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;5.5  繰り返し式&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5.6  文&lt;br /&gt;return文は、Javaプログラミング言語において見られるものと同一である。&lt;br /&gt;&lt;br /&gt;function add(x, y) { &lt;br /&gt;return x + y;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;throw文は、（Javaプログラミング言語では）java.lang.Throwableを拡張したオブジェクトだけが投げられたり捕捉されたりできるという点を除き、Javaプログラミング言語のものと似ている。&lt;br /&gt;&lt;br /&gt;import java.lang.Exception;&lt;br /&gt;&lt;br /&gt;function foo() { &lt;br /&gt;throw new Exception("this is a java exception");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function bar() { &lt;br /&gt;throw "just a string";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;tryとcatch文は、Javaプログラミング言語のものと似ているが、JavaFX台本型プログラミング言語の変数宣言の構文を用いる。&lt;br /&gt;&lt;br /&gt;try { &lt;br /&gt;throw "Hello";&lt;br /&gt;} catch (s:String) { &lt;br /&gt;System.out.println("caught a String: {s}");&lt;br /&gt;} catch (any) { &lt;br /&gt;System.out.println("caught something not a String: {any}");&lt;br /&gt;} finally { &lt;br /&gt;System.out.println("finally...");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;break文とcontinue文は、Javaプログラミング言語のものと似ている。しかし、ラベルは支援されていない。break文とcontinue文は、whileまたはfor繰り返しの本体内に現れなければならない。&lt;br /&gt;&lt;br /&gt;5.7  演算子&lt;br /&gt;JavaFX台本型プログラミング言語は、Javaプログラミング言語にみられるものと同様の標準的な演算子を提供する。次の表は、Javaプログラミング言語における等価物と比較させながら、優先順位に従って演算子を一覧表にしたものである。  &lt;/span&gt;&lt;pre style="font-family: lucida grande;"&gt;&lt;br /&gt;                          表 5.1  演算子の優先順位&lt;br /&gt;優先度  JavaFX演算子   演算                        Java演算子    結合規則&lt;br /&gt;1          =                     代入                        =                   右から左&lt;br /&gt;2          +=                    加算代入                +=&lt;br /&gt;          -=                    減算代入                -+&lt;br /&gt;          *=                    乗算代入                *=&lt;br /&gt;          /=                    除算代入                /=&lt;br /&gt;          %=                    剰余代入                %=&lt;br /&gt;3          and                   論理and                 &amp;amp;&amp;amp;                  右から左&lt;br /&gt;4          or                     論理or                   ||                    右から左&lt;br /&gt;5          instanceof          実体                      instanceof        右から左&lt;br /&gt;          as                    型変換                   該当なし&lt;br /&gt;          sizeof               配列長                   該当なし&lt;br /&gt;          indexof             索引位置                該当なし&lt;br /&gt;          new                  生成                      new&lt;br /&gt;          op()                  関数呼び出し          該当なし&lt;br /&gt;          x.op()                要素関数呼び出し&lt;br /&gt;6          ==                    等価                       ==                   左から右&lt;br /&gt;          &amp;lt;&gt;                 不等価                    !=&lt;br /&gt;          &amp;lt;=                 以下                       &amp;lt;= &lt;br /&gt;          &amp;lt;-      &lt;br /&gt;          &amp;lt;                   小なり                     &amp;lt; &lt;br /&gt;          &gt;                      大なり                     &gt;&lt;br /&gt;7          +                      加算                       +                    右から左&lt;br /&gt;          -                      減算、算術否定        -&lt;br /&gt;8          *                      乗算                        *                   右から左&lt;br /&gt;          /                      除算                        /&lt;br /&gt;          %                      剰余&lt;br /&gt;          =&gt;                    動画&lt;br /&gt;9          ++ (前置)           1増                          ++                  右から左&lt;br /&gt;          -- (前置)          １減                          --&lt;br /&gt;10         ++ (後置)          1増                          ++                  右から左&lt;br /&gt;          -- (後置)          １減                          --&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;&lt;br /&gt;var x = 2;&lt;br /&gt;var y = 4;&lt;br /&gt;var a = true;&lt;br /&gt;var b = false;&lt;br /&gt;System.out.println(x == y); // falseを表示する&lt;br /&gt;System.out.println(x &amp;lt;&gt; y); // trueを表示する&lt;br /&gt;System.out.println(x &amp;lt; y);  // trueを表示する&lt;br /&gt;System.out.println(x &gt; y);  // falseを表示する&lt;br /&gt;System.out.println(x &gt;= y); // falseを表示する&lt;br /&gt;System.out.println(x &amp;lt;= y);  // trueを表示する&lt;br /&gt;System.out.println(x + y);  // 6を表示する&lt;br /&gt;System.out.println(x - y);  // -2を表示する&lt;br /&gt;System.out.println(x * y);  // 8を表示する&lt;br /&gt;System.out.println(x / y);   // 0を表示する&lt;br /&gt;System.out.println(x % y);   // 2を表示する&lt;br /&gt;System.out.println(a and b); // falseを表示する&lt;br /&gt;System.out.println(a or b);  // trueを表示する&lt;br /&gt;System.out.println(not a);  // falseを表示する&lt;br /&gt;System.out.println(sizeof [x,y]); // 2 を表示する&lt;br /&gt;System.out.println([x,y][e | indexof e == 0]); // [ 2 ]を表示する&lt;br /&gt;System.out.println(if (a) x else y); // 2を表示する&lt;br /&gt;System.out.println(for(q in [x, y] where q &amp;lt; 3) q); // [ 2 ]を表示する&lt;br /&gt;System.out.println(Math.max(x, y)); // 4を表示する&lt;br /&gt;System.out.println("abc".toUpperCase()); // ABCを表示する&lt;br /&gt;System.out.println(x); // 2を表示する&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-8959234662634500467?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/8959234662634500467/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=8959234662634500467' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8959234662634500467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8959234662634500467'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafx5.html' title='JavaFX台本型プログラミング言語基準（草案）：第5章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4681876200923548317</id><published>2008-07-01T16:25:00.009+09:00</published><updated>2008-07-01T17:07:58.152+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第4章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;4.変数と基本データ型&lt;br /&gt;4.1  変数&lt;br /&gt;第1章で論じたように、var鍵語は、新たな変数をプログラムに導入するために用いられる。変数の型は、それを宣言する際に指定してもよいが、そうするか否かは自由である。変数の型が宣言から省略されると、その用いられ方から型が推測される。&lt;br /&gt;変数宣言は、次の形式を取る。&lt;br /&gt;&lt;br /&gt;var 変数名 : 型 = 初期化子;&lt;br /&gt;&lt;br /&gt;例：&lt;br /&gt;&lt;br /&gt;var num = 1; // 推測された型&lt;br /&gt;var num : Number = 2;&lt;br /&gt;var firstName = "John"; // 推測された型&lt;br /&gt;var lastName : String = "Doe";&lt;br /&gt;&lt;br /&gt;変数命名法の慣例は、Java™プログラミング言語に見られるものと同様である。クラス名は、各単語の最初の文字を大文字にする（MyClass）。関数名は小文字で始まるが、後に続く各単語の最初の文字は大文字にする（myFunctionName）。定数は、下線文字で区切られた単語により、すべて大文字で表されなければならない（MY_CONSTANT）。&lt;br /&gt;フランス引用符&amp;lt;&amp;lt;&amp;gt;&amp;gt;で囲まれた（空白文字を含む）いかなる文字列も、識別子として扱われる。これにより、JavaFX™台本型プログラミング言語の鍵語（または、他の、通常は不正な識別子）を、クラス、変数、関数、または属性の名前として用いることができる。&lt;br /&gt;例：&lt;br /&gt;&lt;br /&gt;var &amp;lt;&amp;lt;delete&amp;gt;&amp;gt; = 100;&lt;br /&gt;&lt;br /&gt;これは、JavaFX台本型プログラミング言語の鍵語と同じ名前の（Javaプログラミング言語で書かれた）操作を呼び出すことも可能にしている。&lt;br /&gt;&lt;br /&gt;import javax.swing.JTextArea;&lt;br /&gt;&lt;br /&gt;var textArea = new JTextArea();&lt;br /&gt;textArea.&amp;lt;&amp;lt;insert&amp;gt;&amp;gt;("Hello", 0);&lt;br /&gt;&lt;br /&gt;変数の存続期間は、少なくともそれを含むコード区画の存続期間と同じである。&lt;br /&gt;&lt;br /&gt;4.2  基本データ型&lt;br /&gt;JavaFX台本型プログラミング言語では、原始型（プリミティブ型）という用語は使わない。代わりに、5つの基本データ型を定義しており、応用コードで常に利用することができる。&lt;br /&gt;5つの基本データ型は、次のようにJavaプログラミング言語に対応付けられる。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;                                                                 &lt;span style="font-family:lucida grande;"&gt;表4.1  基本型&lt;/span&gt;&lt;br /&gt;&lt;pre  style="font-family:lucida grande;"&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFX台本型プログラミング言語     Javaプログラミング言語&lt;br /&gt;String                                           java.lang.String&lt;br /&gt;Boolean                                        java.lang.Boolean&lt;br /&gt;Number                                        java.lang.Number&lt;br /&gt;Integer                                         byte,short,int,long,BigInteger&lt;br /&gt;Duration                                       該当なし&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;最初の4つの型は、Javaプログラミング言語でもしばしば使われるので、ほとんどの開発者には既におなじみであろう。しかし、Duration型はこれまでになく、JavaFX台本型プログラミング言語に特有のものである。javafx.lang.Durationクラスは、時間の単位（ミリ秒、秒、分、または時間）を表す。Durationクラスを実体化するための簡略表現である、時間直定数も支援している。&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;5ms; // 5ミリ秒&lt;br /&gt;10s; // 10秒&lt;br /&gt;30m; // 30分&lt;br /&gt;1h;  // 1時間&lt;br /&gt;&lt;br /&gt;整数を表す型については、Javaプログラミング言語で書かれた操作と引数または戻り値を受け渡すときに、自動的に強制型変換が行われる。&lt;br /&gt;文字列に関しては、一重引用符または二重引用符を用いて文字列直定数を指定することができる。&lt;br /&gt;&lt;br /&gt;var s1 = 'Hello';&lt;br /&gt;var s2 = "Hello";&lt;br /&gt;&lt;br /&gt;その違いは、後者（二重引用符）を用いると、中括弧（{}）の中に式を埋め込むことができることにある。&lt;br /&gt;&lt;br /&gt;var name = 'Joe';&lt;br /&gt;var s = "Hello {name}"; // s = 'Hello Joe'&lt;br /&gt;&lt;br /&gt;中括弧を用いると、一括変換器は、埋め込まれた式に対する型を推測し、文字列へ強制型変換することができる。&lt;br /&gt;埋め込まれた式自体が引用符で囲まれた文字列を含むことができるので、次々に、さらなる埋め込み式を含むことができる。&lt;br /&gt;&lt;br /&gt;var answer = true;&lt;br /&gt;var s = "The answer is {if (answer) "Yes" else "No"}"; // s = 'The answer is Yes'&lt;br /&gt;&lt;br /&gt;Javaプログラミング言語と異なり、JavaFX台本型プログラミング言語の二重引用符付き文字列は、改行文字を含むことができる。&lt;br /&gt;付加的な書式設定接頭辞を与えることにより、数値とデータがどのように文字列に変換されるかについても制御することができる。そうした接頭辞は、java.util.Formatterの仕様に従う。&lt;br /&gt;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;var hexStr = "hex of 13 is 0x{%02X 13}"; // hexStr = "hex of 13 is 0x0D"&lt;br /&gt;var date = new Date(107, 10, 11);&lt;br /&gt;var dateStr = "{%tc date}";  // dateStr = "日 11 11 00:00:00 JST 2007"&lt;br /&gt;&lt;br /&gt;訳注：原文では、「var dateStr = "{%tc date}";」文末のセミコロン（;）が抜け落ちている。また、日本では、日付は上記コメントの書式で表示される。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4681876200923548317?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4681876200923548317/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4681876200923548317' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4681876200923548317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4681876200923548317'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/07/javafx4.html' title='JavaFX台本型プログラミング言語基準（草案）：第4章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4497750457493634414</id><published>2008-06-30T14:27:00.002+09:00</published><updated>2008-06-30T14:35:49.488+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第3章</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;3.属性と関数&lt;br /&gt;3.1  属性&lt;br /&gt;属性はオブジェクトの状態を定める。それらは、attribute鍵語に続けた、属性名、コロン（:）、セミコロン（;）で終結する属性型で宣言される。&lt;br /&gt;&lt;br /&gt;attribute 属性名 : 属性型  ;&lt;br /&gt;&lt;br /&gt;属性の既定値を宣言することができる（後で、オブジェクト直定数で与えられる値に定義しなおすことができる）。初期化子は、新たに生成されたオブジェクトのもとで、クラス宣言内で属性が指定された順に評価される。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;class X {&lt;br /&gt;     attribute a: Number = 10;&lt;br /&gt;     attribute b: Number = -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var x = X { };&lt;br /&gt;System.out.println(x.a); // 10.0を表示する&lt;br /&gt;System.out.println(x.b); // -1.0を表示する&lt;br /&gt;&lt;br /&gt;明示的な初期化が行われないと、それぞれの属性は妥当な既定値に設定される。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;class DefaultValuesDemo {&lt;br /&gt;     attribute a: Number;&lt;br /&gt;     attribute b: Integer;&lt;br /&gt;     attribute c: Boolean;&lt;br /&gt;     attribute d: String;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var demo = DefaultValuesDemo {};&lt;br /&gt;System.out.println("Default Value: " + demo.a);&lt;br /&gt;System.out.println("Default Value: " + demo.b);&lt;br /&gt;System.out.println("Default Value: " + demo.c);&lt;br /&gt;System.out.println("Default Value: " + demo.d);&lt;br /&gt;&lt;br /&gt;上記コードは、次の既定値を画面に表示する（注記：最後の行は、空文字列を表示する）。&lt;br /&gt;&lt;br /&gt;Default Value: 0.0&lt;br /&gt;Default Value: 0&lt;br /&gt;Default Value: false&lt;br /&gt;Default Value:&lt;br /&gt;&lt;br /&gt;データ型は、第4章で取り上げられている。&lt;br /&gt;&lt;br /&gt;3.2  関数&lt;br /&gt;関数はオブジェクトの振る舞いを定める。関数は次の形式を取る。&lt;br /&gt;&lt;br /&gt;関数名 (属性名 : 属性型, ...): 戻り型 本体&lt;br /&gt;&lt;br /&gt;ここで、本体は任意の式でかまわない。&lt;br /&gt;関数は第一級オブジェクトである（たとえば、変数に割り当てたり、引数としてほかの関数へ渡すことができる）。&lt;br /&gt;第1章で、何も引数を取らず、何も値を返さないgrow関数を定義している簡単な例を示した。&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;function grow(): Void {&lt;br /&gt;          width++;&lt;br /&gt;          height++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;その例証では、利用者が特定の寸法を指定できるようにした形の、関数の多重定義版も与えた。&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;function grow(amount: Integer): Void {&lt;br /&gt;     width += amount;&lt;br /&gt;     height += amount;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;関数は無名にもなりうる。無名関数は、GUI構成部品のaction属性に振る舞いを割り当てる際に、しばしば利用される。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import javafx.gui.*;&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;     visible: true&lt;br /&gt;     content: FlowPanel {&lt;br /&gt;          content: Button {&lt;br /&gt;               text: "Click Me!"&lt;br /&gt;               action: function() {&lt;br /&gt;                    System.out.println("Click!");&lt;br /&gt;               }&lt;br /&gt;          }&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4497750457493634414?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4497750457493634414/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4497750457493634414' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4497750457493634414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4497750457493634414'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/06/javafx3.html' title='JavaFX台本型プログラミング言語基準（草案）：第3章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3407037160633978233</id><published>2008-06-29T12:41:00.006+09:00</published><updated>2008-06-30T11:39:24.220+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第2章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;2.クラスとオブジェクト&lt;br /&gt;2.1  クラスを取り込む&lt;br /&gt;import文は、Javaプログラミング言語と同様に機能する。その構文は、&lt;br /&gt;&lt;br /&gt;import パッケージ名.クラス名;&lt;br /&gt;&lt;br /&gt;または、&lt;br /&gt;&lt;br /&gt;import パッケージ名.*;&lt;br /&gt;&lt;br /&gt;である。&lt;br /&gt;import文が存在する場合は、それ以外のすべての応用コードの前になければならない。JavaFX台本型プログラミング言語は、自身の組み込みライブラリクラスのための名前空間（パッケージjavafx.*）を定義しているが、標準的なJavaプログラミング言語のクラスを取り込むこともできる。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import javafx.gui.*;&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;  visible: true&lt;br /&gt;  content: FlowPanel {&lt;br /&gt;       content: Button {&lt;br /&gt;            text: "Click Me"&lt;br /&gt;            action: function() {&lt;br /&gt;                 System.out.println("Click!");&lt;br /&gt;            }&lt;br /&gt;       }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;クラスに関する利用修飾子は、Javaプログラミング言語におけるのと同様に機能する。クラスは、public、protected、またはprivateとして宣言でき、それぞれ、どこからでも（public）、現行のパッケージ内または派生クラス内から（protected）、もしくは現行クラス内のみから（private）利用できる。&lt;br /&gt;注記：JavaFX台本型プログラミング言語は、構築子を支援していない。構築子の作用をまねるためには、新たなオブジェクトを返す静的関数を定義し、代わりにその関数を呼び出すことである。&lt;br /&gt;&lt;br /&gt;2.2  クラスを定義する&lt;br /&gt;JavaFX台本型プログラミング言語は多重継承を支援しており、そうしたものとして、新たな用語と規定を定義している。&lt;br /&gt;・単純クラスは、Javaプログラミング言語で書かれたクラスを直接的または間接的に拡張した任意のクラスである。&lt;br /&gt;・複合クラスは、単純クラスには当てはまらないすべてのクラスである。&lt;br /&gt;・既定では、JavaFX台本型プログラミング言語で書かれたクラスは複合クラスである。&lt;br /&gt;・クラスは、単純クラス一つだけを拡張することができる。そうしたクラスは、単純クラスとなる。クラスはまた、任意の数の複合クラスまたはJavaプログラミング言語のインタフェースを拡張することもできる。&lt;br /&gt;注記：現在のところ、単純クラスはJavaクラスに変換され、複合クラスはJavaクラスとJavaインタフェースに変換される。&lt;br /&gt;クラスを指定するための構文は、class鍵語に続けたクラス名、任意としてのextends鍵語とカンマ（,）で区切った基底クラス名の一覧、左中括弧（{）、それぞれセミコロン（;）で終結している属性と関数の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;一覧&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;、そして右中括弧（}）からなる。&lt;br /&gt;既定では、クラスは同じ原始ファイルの中（モジュール通用範囲としても知られている）でのみ利用できるが、publicと宣言することによりどこからでも利用することができる。JavaFX台本型プログラミング言語は構築子を支援していないことに留意すること。構築子の作用をまねるためには、新たなオブジェクトを返す静的関数を定義し、代わりにその関数を呼び出すことである。&lt;br /&gt;&lt;br /&gt;2.3  オブジェクトを定義する&lt;br /&gt;前の章で述べたように、クラス実体化の推奨方法はオブジェクト直定数を使うことである。この形式のオブジェクト割り当ては、クラス名とその後に続く中括弧でくくった属性初期化子の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;一覧&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;から構成される宣言的構文を用いる。それぞれの初期化子は、属性名に、コロン（:）と属性の値を定義する式を続けて構成する。&lt;br /&gt;オブジェクトを生成する際にnew鍵語を使うこともできるが、それは、Javaプログラミング言語のクラスの実体化がオブジェクト直定数によっては不可能である場合のために取っておくべきである。&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;&lt;br /&gt;var tmpPath = "/home/users/docs/tmp.txt"&lt;br /&gt;var myFile = new File("tmp.txt");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3407037160633978233?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3407037160633978233/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3407037160633978233' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3407037160633978233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3407037160633978233'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/06/javafx2.html' title='JavaFX台本型プログラミング言語基準（草案）：第2章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4956841188767424446</id><published>2008-06-27T20:10:00.008+09:00</published><updated>2008-06-30T11:40:22.251+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX台本型プログラミング言語基準（草案）：第1章</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;以前から、一括変換型に変わったJavaFX言語の全ぼうを知りたいと思っていたのですが、ちょうどいい文書「&lt;a href="http://openjfx.java.sun.com/current-build/doc/reference/JavaFX-Language.html"&gt;The JavaFX™ Script Programming Language Reference  (Draft)&lt;/a&gt;」が、しばらく前に公開されました。&lt;br /&gt;今回から何回かに分けて、その和訳を載せたいと思います。訳にはつたないところもありますが、ご容赦ください。また、コード例の部分では、字下げが抜けてしまっているため読みづらいと思いますが、あわせてご容赦ください。&lt;br /&gt;今回は、目次と第1章です。&lt;br /&gt;---------------------------------------------------------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JavaFX台本型プログラミング言語基準（草案）&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;目次&lt;br /&gt;1.言語概要&lt;br /&gt;2. クラスとオブジェクト&lt;br /&gt;3.属性と関数&lt;br /&gt;4.変数と基本データ型&lt;br /&gt;5.式、文、および演算子&lt;br /&gt;6.列&lt;br /&gt;7.列内包&lt;br /&gt;8.データ結合&lt;br /&gt;9.引き金&lt;br /&gt;A.鍵語と予約語&lt;br /&gt;&lt;br /&gt;1.言語概要&lt;br /&gt;この章では、JavaFX台本型プログラミング言語の概要について説明する。ここでは主な特徴の概要を述べ、特定の構成概念についての詳述は後の章で行う。この本は、Java™ Web Startソフトウェアとしてまたは従来型の机上応用プログラムとしてウェブ（Web）ページ内で実行される、表現力豊かなインタネット依頼者側応用プログラムや要素の、設計者および開発者を対象としたものである。読者がJavaScriptおよび／またはJava™プログラミング言語に精通していることを想定している。&lt;br /&gt;JavaFX台本型プログラミング言語は、&lt;br /&gt;・図式利用者インタフェース（GUI）構成部品の指定に宣言型構文を使用しており、開発者のプログラムコードをGUIの実際の配置にぴたりと対応させることを可能にしている。&lt;br /&gt;・宣言型データ結合と増分評価を使用しており、個々の構成部品を容易に作成および構成することを可能にしている。（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;データ結合により）&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;応用プログラムのデータとGUIの構成部品は、自動的に同期がとられる。&lt;br /&gt;・静的に型付けされており、Javaプログラミング言語において大規模プログラムの作成と保守を可能にしているコード構造、再利用および情報隠ぺいなど&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の特性&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;と同様のものをほとんどを持っている。&lt;br /&gt;・Javaプログラミング言語によるソフトウェア開発のための基準実装IDE（統合開発環境）であるNetBeansIDEを含め、すべての主要IDEと連携する。&lt;br /&gt;・どのような規模または複雑さのGUIも提供することができる。&lt;br /&gt;・Swingの使用を容易にする。&lt;br /&gt;以下の節では、JavaFX台本型プログラミング言語について駆け足で紹介する。しかるべき点についてはJavaプログラミング言語と比較および対比させながら、その核となる構文と機能についての一般的な導入を与える。そして、それぞれの主題は後の章で更に詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;1.1  クラス&lt;br /&gt;クラスの定義は、Javaプログラミング言語と多くの共通点を持っているが、相違点もある。たとえば、情報は、領域ではなく、属性に格納される。振る舞いは、操作ではなく、関数によってあらわにされる。次の例は、それぞれの基本構文を示す簡単な矩形クラスを定義している。&lt;br /&gt;&lt;br /&gt;class Rectangle {&lt;br /&gt;attribute width: Integer;&lt;br /&gt;attribute height: Integer;&lt;br /&gt;&lt;br /&gt;function grow(): Void {&lt;br /&gt;width++;&lt;br /&gt;height++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function grow(amount: Integer): Void {&lt;br /&gt;width += amount;&lt;br /&gt;height += amount;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Javaプログラミング言語とは異なり、クラス定義では、既存のライブラリを単に利用する必要はない。更に、JavaFX台本型プログラミング言語は多重継承を支援しており、必要なら複数のクラスを継承することができる。&lt;br /&gt;クラスは、第2章で詳しく取り上げられる。&lt;br /&gt;属性と関数は、第3章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;1.2  オブジェクト&lt;br /&gt;オブジェクト直定数は、クラスの実体化のための簡単な構文を提供する。次のコードは、前述した矩形クラスの単一の実体を生成し、その幅と高さの属性を100に初期化する（newを必要としない点に留意すること）。&lt;br /&gt;&lt;br /&gt;Rectangle {&lt;br /&gt;width: 100&lt;br /&gt;height 100&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;このオブジェクトへの参照を格納するには、var鍵語を使う。&lt;br /&gt;&lt;br /&gt;var myRect = Rectangle {&lt;br /&gt;width: 100&lt;br /&gt;height 100&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;オブジェクトは、第2章で詳しく取り上げられる。&lt;br /&gt;変数と基本データ型は、第4章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;1.3  式、文、および演算子&lt;br /&gt;他のプログラミング言語と同様に、JavaFX台本型プログラミング言語は、式、文、および演算子を支援する。&lt;br /&gt;第5章は、JavaFX台本型プログラミング言語において利用可能な式、文、および演算子について論じる。&lt;br /&gt;&lt;br /&gt;1.4  列&lt;br /&gt;列は、オブジェクトの順序付けられた一覧を保持する。これは、Javaプログラミング言語の配列にほぼ類似している。両方とも複数の値を保持し、0から始まる索引により検索される。&lt;br /&gt;&lt;br /&gt;var week = ["Monday","Tuesday","Wednesday","Thursday",&lt;br /&gt;"Friday","Saturday","Sunday"];&lt;br /&gt;var mon = week[0];&lt;br /&gt;var wed = week[2];&lt;br /&gt;var fri = week[4];&lt;br /&gt;&lt;br /&gt;部分列も支援されている。&lt;br /&gt;&lt;br /&gt;var week = ["Monday","Tuesday","Wednesday","Thursday",&lt;br /&gt;"Friday","Saturday","Sunday"];&lt;br /&gt;var weekdays = week[0..4]; // 第1部分列&lt;br /&gt;var weekend = week[5..6]; // 第2部分列&lt;br /&gt;&lt;br /&gt;第6章は列宣言の基本を取り上げており、第7章は列内包に焦点を当てている。&lt;br /&gt;&lt;br /&gt;1.5  データ結合&lt;br /&gt;データ結合は、複数オブジェクトの状態を同期させるための簡単な構文を提供する。2つのオブジェクトが互いに結合されると、1番目のオブジェクトが更新されたときはいつも2番目のオブジェクトの値が自動的に変更される。データ結合の一般的な利用法は、GUI部品をその基となるデータに同期し続けることである。&lt;br /&gt;&lt;br /&gt;import javafx.gui.Frame;&lt;br /&gt;import javafx.gui.Button;&lt;br /&gt;&lt;br /&gt;var myString = "Click Me";&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;width: 50&lt;br /&gt;height: 50&lt;br /&gt;visible: true&lt;br /&gt;content:&lt;br /&gt;Button {&lt;br /&gt;text: bind myString&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;// コードのほかの部分でmyStringを変更すると、&lt;br /&gt;// ボタン上の文字列も自動的に変更される。&lt;br /&gt;&lt;br /&gt;データ結合は、第8章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;1.6  引き金&lt;br /&gt;引き金は、ある条件が満たされると実行されるコードの区画である。たとえば、ある属性の値が不適切なものに設定されることを、防ぐための処置を講じたいと思うことがあるかもしれない。次の例は、引き金の基本構文を示す。&lt;br /&gt;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;ReplaceDemo {&lt;br /&gt;mySensitiveData: "Will anyone notice?"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class ReplaceDemo {&lt;br /&gt;attribute mySensitiveData: String&lt;br /&gt;on replace {&lt;br /&gt;System.out.println("I noticed a change!");&lt;br /&gt;};&lt;br /&gt;// 応用特有の保護手段コードがここに書かれる&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;引き金は、第9章で詳しく取り上げられる。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4956841188767424446?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4956841188767424446/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4956841188767424446' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4956841188767424446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4956841188767424446'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/06/javafx1.html' title='JavaFX台本型プログラミング言語基準（草案）：第1章'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3617851127879932602</id><published>2008-02-02T19:53:00.000+09:00</published><updated>2008-02-03T16:00:25.743+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='一括変換型ＪａｖａＦＸ言語'/><title type='text'>一括変換型JavaFX指導書連載第1回の要</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;&lt;a href="http://terrasweblog.blogspot.com/2008/02/javafx.html"&gt;いきなりつまずいてしまいました&lt;/a&gt;が、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Sun Developer Network (SDN) の&lt;a href="http://java.sun.com/developer/technicalArticles/javafx/index.html"&gt;Technical Articles and Tips &gt; JavaFX Technology&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;に、6箇月&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;18回にわたって連載される&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;一括変換型JavaFXスクリプト指導書について、主に逐次解釈型JavaFXとの相違点を中心にまとめておきたいと思います。&lt;br /&gt;まずは、第1回目の「&lt;a href="http://java.sun.com/developer/technicalArticles/scripting/javafx/ria_1/"&gt;Creating Rich Internet Applications With Compiled JavaFX Script Technology&lt;/a&gt;」から。&lt;br /&gt;1.定数値の記述方法の変更&lt;br /&gt;Frameオブジェクトのbackground属性に指定する色名や、Fontオブジェクトのstyle属性に指定する書体名などの定数値は、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;逐次&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;解釈&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;型ではそれぞれwhite、BOLDのようにクラス名なしで記述していましたが、一括変換型では&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Color.WHITE、FontStyle.BOLDのようにクラス名付きで&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;記述&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;します。&lt;br /&gt;2.手続きの記述方法の統一&lt;br /&gt;Buttonオブジェクトのaction属性などに指定する戻り値なしの手続きは、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;逐次&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;解釈&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;型ではoperation()として定義していましたが、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;一括変換型では戻り値なしのfunction()として定義します。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;operation()は&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;function()に統一されます。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3617851127879932602?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3617851127879932602/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3617851127879932602' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3617851127879932602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3617851127879932602'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/02/javafx1.html' title='一括変換型JavaFX指導書連載第1回の要'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-6828440176479710270</id><published>2008-02-02T15:17:00.000+09:00</published><updated>2008-02-02T16:01:14.174+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>一括変換済みJavaFXコードが実行できるようになりました</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;&lt;a href="http://terrasweblog.blogspot.com/2008/02/javafx_01.html"&gt;前回の投稿&lt;/a&gt;で記した、一括変換済みJavaFXコードの実行時誤りが解決しました。&lt;br /&gt;前回の投稿でも記しましたが、私が使用していたJDKの版数は、JDK 1.5.0_11でした。これを、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JDK 1.6.0_04（今日現在の最新版）に更新することにより、無事&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;一括変換済みJavaFXコードを実行することができるようになりました。&lt;br /&gt;いつかはJDK 6に更新しなくてはと思いながら先延ばししていたものですから、すっきりしました（どうしても、「動いているものはいじるな」という気が働いてしまうものですから）。また、NetBeansも、6.0.1日本語版に更新しなくてはと思っていたので、ちょうど良かったです（それにしても、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;NetBeans 6.0.1日本語版は、なかなか公開されませんね&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;）。&lt;br /&gt;JDKを更新した後、念のため、&lt;/span&gt;&lt;code&gt;archive.zipを展開しなおし、一括変換も再度行いました。&lt;br /&gt;なお、&lt;a href="http://terrasweblog.blogspot.com/2007/12/javafx.html"&gt;以前の投稿&lt;/a&gt;で&lt;/code&gt;&lt;span style="font-family: lucida grande;"&gt;記した&lt;/span&gt;&lt;code&gt;ように、&lt;/code&gt;&lt;span style="font-family: webdings;"&gt;OpenJFX&lt;/span&gt;&lt;code&gt;逐次解釈器のbinディレクトリを&lt;/code&gt;&lt;span style="font-family: webdings;"&gt;PATH環境変数に設定している場合は、「&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;OpenJFX\trunk\bin&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;;」を「&lt;/span&gt;&lt;code&gt;archive/openjfx-compiler/dist/bin&lt;/code&gt;&lt;span style="font-family: webdings;"&gt;;」に置き換えるのを忘れないでください（&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;「&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;OpenJFX\trunk\bin&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;;」の前に追加してもかまいませんが&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;）。&lt;br /&gt;今度のjavafx命令は、実行しても余計な報告文を表示しないので、すっきりしてます。また、私のように、&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;CLASSPATH環境変数に何かを設定していても、そのまま（&lt;/span&gt;&lt;span style="font-family: webdings;"&gt;CLASSPATHの値を空にすることなく）実行できます:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-6828440176479710270?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/6828440176479710270/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=6828440176479710270' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6828440176479710270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/6828440176479710270'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/02/javafx_02.html' title='一括変換済みJavaFXコードが実行できるようになりました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-8476705310899948227</id><published>2008-02-01T22:37:00.000+09:00</published><updated>2008-02-01T23:11:12.497+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFX一括変換器の変換誤りの原因が分かりました</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;&lt;a href="http://terrasweblog.blogspot.com/2008/02/javafx.html"&gt;前回の投稿&lt;/a&gt;で述べたJavaFX一括変換器の誤りの原因が分かりました。&lt;br /&gt;なんと、一括変換器の不具合ではなく、コード例1のコードに誤りがありました。コード例の中ほどに、&lt;br /&gt;-----------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;MessageDialog {&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: lucida grande;"&gt;                    title: "JavaFX Script Rocks!"&lt;br /&gt;                  // This string has a newline in the source code.&lt;br /&gt;                  message: "JavaFX Script is Simple, Elegant,&lt;br /&gt;                  and Leverages the Power of Java&lt;/pre&gt;&lt;span style="font-family:lucida grande;"&gt;--------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;という記述があります。そのmessage属性の設定文で、閉じ二重引用符が抜けていることが原因でした（正しくは、「・・・ Power of Java"」と二重引用符で終わらなければならない）。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;不足している二重引用符を追加すると、無事一括変換が実行されます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;ところが、実行に移ると、今度は次のような誤りが発生してしまいました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;        at java.lang.ClassLoader.defineClass1(Native Method)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;指導書には、JRE ５以降を使用すれば実行できると書いてあり、私は、JDK 1.5.0_11を使用しているのですが、どうもそうではないようです（まだ、Javaの版数に原因があると決まったわけではないのですが）。「一難さってまた一難」というところですが、また何か分かりましたら投稿します。&lt;br /&gt;どなたか、JDK 6で試された方はいらっしゃいませんか。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-8476705310899948227?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/8476705310899948227/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=8476705310899948227' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8476705310899948227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8476705310899948227'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/02/javafx_01.html' title='JavaFX一括変換器の変換誤りの原因が分かりました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-8219043175841551079</id><published>2008-02-01T14:46:00.000+09:00</published><updated>2008-02-01T15:23:55.527+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>一括変換型JavaFX指導書の連載が始まったのですが…</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;Sun Developer Network (SDN) の&lt;a href="http://java.sun.com/developer/technicalArticles/javafx/index.html"&gt;Technical Articles and Tips &gt; JavaFX Technology&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;で、一括変換型JavaFXスクリプトについての18回連載が開始されました。&lt;br /&gt;早速、第1回目の「&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/scripting/javafx/ria_1/"&gt;Creating Rich Internet Applications With Compiled JavaFX Script Technology&lt;/a&gt;」を読み、勇んでJavaFX一括変換器の保管ファイルを入手し、記事に載っていたコード例1を一括変換してみました。ところが、「line 56:0 rule RBRACE failed predicate: { !BraceQuoteTracker.rightBraceLikeQuote(CUR_QUOTE_CTX) }?」という誤り文が、繰り返して表示されるだけで、一括変換できませんでした。&lt;br /&gt;内容から察するに、中括弧の処理がうまくできないようですが、コード例には特に問題があるようには思えません。また、誤り文の表示が無限に繰り返される点からも、一括変換器自体に問題がありそうです。&lt;br /&gt;JavaFXの一括変換器が利用できるのを心待ちにしていただけに、ちょっと残念です。&lt;br /&gt;何か分かったら、また投稿します。&lt;/span&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/javafx/index.html"&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-8219043175841551079?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/8219043175841551079/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=8219043175841551079' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8219043175841551079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8219043175841551079'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/02/javafx.html' title='一括変換型JavaFX指導書の連載が始まったのですが…'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1605909693114798814</id><published>2008-01-21T12:12:00.000+09:00</published><updated>2008-12-11T09:24:48.464+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：警報を発する（2）</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;Javaプログラムで警報音を鳴動させる準備が整いましたので、JavaFXのプログラムで警報文の表示と警報音の鳴動開始／停止を制御させます。&lt;br /&gt;依頼者プログラムから模擬計測値を入力したところで、その値と現在警報を発生中か否かを判定して、警報音の鳴動と警報文の表示制御を行っています。&lt;br /&gt;今回、警報文の表示には、JavaFXのConfirmDialogクラスを使ってみました。表示された対話窓にある「了解」ボタンを押すと、onYes属性に定義した操作を実行する仕組みです。&lt;br /&gt;企画を構築して実行すると枠付き窓が表示されます。模擬計測値が90.0を超えると、下図のような警報文の対話窓が表示されます。模擬計測値が設定値を超えている限り、了解ボタンを押しても何度でも警報が発生するようにしています。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;プログラム例では、表示速度を3倍に速くしています。:-P)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_v58IVq86t4s/R5QPQiHVX-I/AAAAAAAAABk/f3qKkvtF7rU/s1600-h/JavaFXScadaUI%E7%94%BB%E9%9D%A205.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_v58IVq86t4s/R5QPQiHVX-I/AAAAAAAAABk/f3qKkvtF7rU/s400/JavaFXScadaUI%E7%94%BB%E9%9D%A205.jpg" alt="" id="BLOGGER_PHOTO_ID_5157764249955950562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import client.ScadaClient;&lt;br /&gt;&lt;br /&gt;class ScadaDataModel {&lt;br /&gt;  attribute presenting: Boolean;&lt;br /&gt;  attribute alarting: Boolean;&lt;br /&gt;  attribute timingGenerator: Number;&lt;br /&gt;  attribute numericDatum: Number;&lt;br /&gt;  attribute numericData: Number*;&lt;br /&gt;  attribute sc: ScadaClient;&lt;br /&gt;  function formatNumber(value:Number): String;&lt;br /&gt;  operation getDisplayColor(value:Number): Color;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute ScadaDataModel.timingGenerator&lt;br /&gt;  = bind [1..180] dur 60000 linear continue if presenting;&lt;br /&gt;&lt;br /&gt;attribute ScadaDataModel.numericData&lt;br /&gt;  = foreach (i in [0..180]) 0;&lt;br /&gt;&lt;br /&gt;function ScadaDataModel.formatNumber(value:Number): String {&lt;br /&gt;  return value format as &lt;&lt;##0.00&gt;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;operation ScadaDataModel.getDisplayColor(value:Number): Color {&lt;br /&gt;  var c:Color = green;&lt;br /&gt;  if (value &gt; 90.0) {&lt;br /&gt;    c = red;&lt;br /&gt;  } else if (value &gt; 75.0) {&lt;br /&gt;    c = Color {red: 1.0, green: 0.5, blue: 0.0};&lt;br /&gt;  }&lt;br /&gt;  return c;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on new ScadaDataModel {&lt;br /&gt;  sc = new ScadaClient();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on ScadaDataModel.timingGenerator = value {&lt;br /&gt;  numericDatum = sc.receiveData();&lt;br /&gt;  delete numericData[0];&lt;br /&gt;  insert numericDatum as last into numericData;&lt;br /&gt;  System.out.println("受信生データ: {numericDatum}");&lt;br /&gt;  System.out.println("書式化データ: {formatNumber(numericDatum)}");&lt;br /&gt;  if ((numericDatum &gt; 90.0) and (not alarting)) {&lt;br /&gt;    alarting = true;&lt;br /&gt;    sc.startAlarm();&lt;br /&gt;    ConfirmDialog {&lt;br /&gt;        title: "警報"&lt;br /&gt;        message: "流量が上上限値を超過しました！"&lt;br /&gt;        visible: true&lt;br /&gt;        onYes:&lt;br /&gt;        operation() {&lt;br /&gt;          sc.stopAlarm();&lt;br /&gt;          alarting = false;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;  var scadaData = ScadaDataModel {presenting: true, alarting: false}&lt;br /&gt;  title: "JavaFX SCADA UI"&lt;br /&gt;  centerOnScreen: true&lt;br /&gt;  width: 800&lt;br /&gt;  height: 600&lt;br /&gt;  background: Color {red: 0.9, green: 0.9, blue: 0.9}&lt;br /&gt;  onClose: operation() {System.exit(0);}&lt;br /&gt;  content: BorderPanel {&lt;br /&gt;    center: Canvas {&lt;br /&gt;      content:&lt;br /&gt;        [Group {&lt;br /&gt;          transform: translate(50, 50)&lt;br /&gt;          content:&lt;br /&gt;            [Rect {&lt;br /&gt;              height: 18&lt;br /&gt;              width: 50&lt;br /&gt;              arcHeight: 4&lt;br /&gt;              arcWidth: 4&lt;br /&gt;              stroke: blue&lt;br /&gt;              fill: white&lt;br /&gt;            },&lt;br /&gt;            Text {&lt;br /&gt;              content: bind scadaData.formatNumber(scadaData.numericDatum)&lt;br /&gt;              font: new Font("Monospaced", "PLAIN", 14)&lt;br /&gt;              x: 47&lt;br /&gt;              y: 4&lt;br /&gt;              halign: TRAILING&lt;br /&gt;              fill: bind scadaData.getDisplayColor(scadaData.numericDatum)&lt;br /&gt;            },&lt;br /&gt;            Text {&lt;br /&gt;              content: "m3/s"&lt;br /&gt;              x: 54&lt;br /&gt;              y: 6&lt;br /&gt;            }&lt;br /&gt;          ]&lt;br /&gt;        },&lt;br /&gt;        Group {&lt;br /&gt;          transform: translate(200, 50)&lt;br /&gt;          content:&lt;br /&gt;            [&lt;br /&gt;            Rect {&lt;br /&gt;              height: 120&lt;br /&gt;              width: 55&lt;br /&gt;              stroke: blue&lt;br /&gt;              fill: white&lt;br /&gt;            },&lt;br /&gt;            Rect {&lt;br /&gt;              x: 10&lt;br /&gt;              y: 10&lt;br /&gt;              height: 100&lt;br /&gt;              width: 10&lt;br /&gt;              fill: LinearGradient {&lt;br /&gt;                x1: 0, y1: 0, x2: 0, y2: 1&lt;br /&gt;                stops:&lt;br /&gt;                  [Stop {&lt;br /&gt;                    offset: 0.1&lt;br /&gt;                    color: red&lt;br /&gt;                  },&lt;br /&gt;                  Stop {&lt;br /&gt;                    offset: 0.2&lt;br /&gt;                    color: Color {red: 1.0, green: 0.5, blue: 0.0}&lt;br /&gt;                  },&lt;br /&gt;                  Stop {&lt;br /&gt;                    offset: 0.4&lt;br /&gt;                    color: Color {red: 0.5, green: 1.0, blue: 0.0}&lt;br /&gt;                  }]&lt;br /&gt;                  spreadMethod: PAD&lt;br /&gt;                }&lt;br /&gt;            },&lt;br /&gt;            Rect {&lt;br /&gt;              x: 10&lt;br /&gt;              y: 10&lt;br /&gt;              height: bind 100 - scadaData.numericDatum&lt;br /&gt;              width: 10&lt;br /&gt;              fill: Color {red: 0.5, green: 0.5, blue: 0.5}&lt;br /&gt;            },&lt;br /&gt;            Line {&lt;br /&gt;              x1: 23&lt;br /&gt;              y1: 10&lt;br /&gt;              x2: 23&lt;br /&gt;              y2: 110&lt;br /&gt;              stroke: black&lt;br /&gt;            },&lt;br /&gt;            Group {&lt;br /&gt;              transform: translate(23, 10)&lt;br /&gt;              content: foreach (i in [0,20..100])&lt;br /&gt;                Line {&lt;br /&gt;                  transform: [translate(0, i)]&lt;br /&gt;                  x1: 0&lt;br /&gt;                  y1: 0&lt;br /&gt;                  x2: 3&lt;br /&gt;                  y2: 0&lt;br /&gt;                  stroke: black&lt;br /&gt;                }&lt;br /&gt;            },&lt;br /&gt;            Group {&lt;br /&gt;              transform: translate(32, 10)&lt;br /&gt;              content: foreach (i in [0,20..100])&lt;br /&gt;                Text {&lt;br /&gt;                  transform: [translate(0, 100 - i)]&lt;br /&gt;                  content: "{i}"&lt;br /&gt;                  font: new Font("Monospaced", "PLAIN", 8)&lt;br /&gt;                  valign: MIDDLE&lt;br /&gt;                  halign: LEADING&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;          ]&lt;br /&gt;        },&lt;br /&gt;        Group {&lt;br /&gt;          transform: translate(50, 200)&lt;br /&gt;          content:&lt;br /&gt;            [&lt;br /&gt;            Rect {&lt;br /&gt;              height: 120&lt;br /&gt;              width: 230&lt;br /&gt;              stroke: blue&lt;br /&gt;              fill: white&lt;br /&gt;            },&lt;br /&gt;            Rect {&lt;br /&gt;              x: 10&lt;br /&gt;              y: 35&lt;br /&gt;              height: 76&lt;br /&gt;              width: 181&lt;br /&gt;              fill: black&lt;br /&gt;            },&lt;br /&gt;            Rect {&lt;br /&gt;              x: 10&lt;br /&gt;              y: 20&lt;br /&gt;              height: 15&lt;br /&gt;              width: 181&lt;br /&gt;              fill: Color {red: 0.3, green: 0.3, blue: 0.3}&lt;br /&gt;            },&lt;br /&gt;            Rect {&lt;br /&gt;              x: 10&lt;br /&gt;              y: 10&lt;br /&gt;              height: 10&lt;br /&gt;              width: 181&lt;br /&gt;              fill: Color {red: 0.5, green: 0.5, blue: 0.5}&lt;br /&gt;            },&lt;br /&gt;            Line {&lt;br /&gt;              x1: 194&lt;br /&gt;              y1: 10&lt;br /&gt;              x2: 194&lt;br /&gt;              y2: 110&lt;br /&gt;              stroke: black&lt;br /&gt;            },&lt;br /&gt;            Group {&lt;br /&gt;              transform: translate(194, 10)&lt;br /&gt;              content: foreach (i in [0,20..100])&lt;br /&gt;                Line {&lt;br /&gt;                  transform: [translate(0, i)]&lt;br /&gt;                  x1: 0&lt;br /&gt;                  y1: 0&lt;br /&gt;                  x2: 3&lt;br /&gt;                  y2: 0&lt;br /&gt;                  stroke: black&lt;br /&gt;                }&lt;br /&gt;            },&lt;br /&gt;            Group {&lt;br /&gt;              transform: translate(203, 10)&lt;br /&gt;              content: foreach (i in [0,20..100])&lt;br /&gt;                Text {&lt;br /&gt;                  transform: [translate(0, 100 - i)]&lt;br /&gt;                  content: "{i}"&lt;br /&gt;                  font: new Font("Monospaced", "PLAIN", 8)&lt;br /&gt;                  valign: MIDDLE&lt;br /&gt;                  halign: LEADING&lt;br /&gt;                }&lt;br /&gt;            },&lt;br /&gt;            Group {&lt;br /&gt;              transform: translate(10, 10)&lt;br /&gt;              content: foreach (i in [0..179])&lt;br /&gt;                Line {&lt;br /&gt;                  transform: [translate(i, 0)]&lt;br /&gt;                  x1: 0&lt;br /&gt;                  y1: bind 100 - scadaData.numericData[i]&lt;br /&gt;                  x2: 1&lt;br /&gt;                  y2: bind 100 - scadaData.numericData[i + 1]&lt;br /&gt;                  stroke: bind scadaData.getDisplayColor(scadaData.numericData[i + 1])&lt;br /&gt;                  strokeWidth: 2&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;          ]&lt;br /&gt;        }&lt;br /&gt;      ]&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  visible: true&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1605909693114798814?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1605909693114798814/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1605909693114798814' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1605909693114798814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1605909693114798814'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/01/javafx-scada-ui2.html' title='JavaFX SCADA UI：警報を発する（2）'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_v58IVq86t4s/R5QPQiHVX-I/AAAAAAAAABk/f3qKkvtF7rU/s72-c/JavaFXScadaUI%E7%94%BB%E9%9D%A205.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3745839265871525720</id><published>2008-01-17T16:26:00.000+09:00</published><updated>2008-01-17T16:33:39.518+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>IBMのdeveloperWorksでJavaFXが紹介されました</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;ついに、IBMの&lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks" class="left-nav-overview"&gt;developerWorks&lt;/a&gt;&lt;span style="font-family: lucida grande;"&gt;にもJavaFXについての&lt;a href="http://www.ibm.com/developerworks/java/library/j-javafx/"&gt;手引&lt;/a&gt;が載りました。これを機会に、JavaFXがより普及するとうれしいのですが。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3745839265871525720?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3745839265871525720/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3745839265871525720' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3745839265871525720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3745839265871525720'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/01/ibmdeveloperworksjavafx.html' title='IBMのdeveloperWorksでJavaFXが紹介されました'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-2347656361362646241</id><published>2008-01-15T12:29:00.000+09:00</published><updated>2008-01-16T12:50:19.465+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：警報を発する</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;次に、SCADA情報として入力した模擬計測値が、あらかじめ設定した値を超えたら警報を発するようにしてみます。&lt;br /&gt;まず、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;Javaで記述した模擬依頼者プログラムにコードを追加し、警報音の鳴動開始と、同停止手続きを追加します。&lt;br /&gt;警報音のファイルは、構築子を定義してその中で読み込むようにしたかったのですが、構築子を定義すると、なぜかJavaFXのプログラムからJavaプログラムの手続きを呼び出さなくなってしまいます（誤りが発生するわけでもありません）。仕方ないので、実体変数の定義時に初期化を行って、音声ファイルを読み込むようにしました。&lt;br /&gt;私は、警報音ファイルとして、自分のPCにあった「ALERT.WAV」を使用しました。Javaのプログラムでの音声ファイルの扱いについては、&lt;a href="http://terrasweblog.blogspot.com/2007/12/javafx2.html"&gt;この投稿&lt;/a&gt;を参照してください（今回、警報文は、JavaFXのプログラムで表示することにしました。また、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;鳴動開始と停止を別の手続きにしています&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;）。&lt;br /&gt;音声ファイルを「企画名\build\classes\包み名」ディレクトリに置きます。そして、NetBeansの「プロジェクト」窓でJavaファイルをマウスで右押しし、「ファイルをコンパイル」を選択実行して、Javaファイルを一括変換しておきます。&lt;br /&gt;最後に、Javaプログラムのコードを載せておきます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import java.applet.Applet;&lt;br /&gt;import java.applet.AudioClip;&lt;br /&gt;&lt;br /&gt;public class ScadaClient {&lt;br /&gt; &lt;br /&gt;  private AudioClip ac = Applet.newAudioClip(ScadaClient.class.getResource("ALERT.WAV"));&lt;br /&gt;  // 模擬SCADAデータ生成用作業変数。&lt;br /&gt;  private int i = -1;&lt;br /&gt; &lt;br /&gt;  public double receiveData() {&lt;br /&gt;    // 模擬SCADAデータを生成して返す。&lt;br /&gt;    i += 1;&lt;br /&gt;    if (i &gt;= 360) {&lt;br /&gt;      i = 0;&lt;br /&gt;    }&lt;br /&gt;    return (double)(Math.abs(Math.sin(i * Math.PI / 180.0) * 100));&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  public void startAlarm() {&lt;br /&gt;    ac.loop();&lt;br /&gt;  }&lt;br /&gt;  public void stopAlarm() {&lt;br /&gt;    ac.stop();&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    ScadaClient sc = new ScadaClient();&lt;br /&gt;    for (int i = 0; i &lt; 5; i++) {&lt;br /&gt;      System.out.println(sc.receiveData());&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-2347656361362646241?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/2347656361362646241/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=2347656361362646241' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2347656361362646241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2347656361362646241'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/01/javafx-scada-ui_15.html' title='JavaFX SCADA UI：警報を発する'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-5588403708462407590</id><published>2008-01-11T16:12:00.000+09:00</published><updated>2008-12-11T09:24:48.787+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：記録計を作る</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;前回&lt;/span&gt;の棒図式指示計に加えて&lt;span style="font-family:lucida grande;"&gt;、記録計を作ります。&lt;br /&gt;表示装置上の記録計は、常に最新の情報を何点分か配列変数に保持しておき、その情報に基づいて線図式を描画することで実現できます。&lt;br /&gt;Java言語等で配列変数を扱う場合、最新の情報が得られるたびに、既存の配列要素をずらして新たな情報を追加するという操作を行う必要があります。単純な処理ですが、あまり美しいものではありません。&lt;br /&gt;JavaFXでは、単に、配列から最も古い情報を削除し、新たな情報を所要の位置に挿入するだけで済みます。添え字の付け替え操作が不要なため、簡潔で無駄のない記述が可能です。&lt;br /&gt;プログラムの例では、模擬依頼者から新たな情報を取得するたびに、配列の先頭要素を削除し、取得した情報を配列の末尾に挿入しています。&lt;br /&gt;後は、保持している情報を基にして、線図式を描画するだけです。&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_v58IVq86t4s/R4cXuCHVX7I/AAAAAAAAABM/oGbK09N7UG4/s1600-h/JavaFXScadaUI%E7%94%BB%E9%9D%A204.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_v58IVq86t4s/R4cXuCHVX7I/AAAAAAAAABM/oGbK09N7UG4/s320/JavaFXScadaUI%E7%94%BB%E9%9D%A204.jpg" alt="" id="BLOGGER_PHOTO_ID_5154114378157875122" border="0" /&gt;&lt;/a&gt;企画を構築して実行すると枠付き窓が表示され、窓の左下に右図のような記録計が表示されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;package client;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;import javafx.ui.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;import javafx.ui.canvas.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;import java.lang.System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;import client.ScadaClient;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;class ScadaDataModel {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; attribute presenting: Boolean;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; attribute timingGenerator: Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; attribute numericDatum: Number;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; attribute numericData: Number*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; attribute sc: ScadaClient;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; function formatNumber(value:Number): String;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; operation displayColor(value:Number): Color;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;attribute ScadaDataModel.timingGenerator&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; = bind [1..60] dur 60000 linear continue if presenting;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;attribute ScadaDataModel.numericData&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; = foreach (i in [0..180]) 0;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;function ScadaDataModel.formatNumber(value:Number): String {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; return value format as &lt;&lt;##0.00&gt;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;operation ScadaDataModel.displayColor(value:Number): Color {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; var c:Color = green;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; if (value &gt; 90.0) {c = red;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; else if (value &gt; 75.0) {c = Color {red: 1.0, green: 0.5, blue: 0.0};}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; return c;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;trigger on new ScadaDataModel {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; sc = new ScadaClient();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;trigger on ScadaDataModel.timingGenerator = value {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; numericDatum = sc.receiveData();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; delete numericData[0];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; insert numericDatum as last into numericData;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; System.out.println("受信生データ: {numericDatum}");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; System.out.println("書式化データ: {formatNumber(numericDatum)}");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Frame {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; var scadaData = ScadaDataModel {presenting: true}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; title: "JavaFX SCADA UI"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; centerOnScreen: true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; width: 800&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; height: 600&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; background: Color {red: 0.9, green: 0.9, blue: 0.9}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; onClose: operation() {System.exit(0);}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; content: BorderPanel {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;   center: Canvas {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;     content:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;       [Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         transform: translate(50, 50)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         content:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           [Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: 18&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 50&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             arcHeight: 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             arcWidth: 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             stroke: blue&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: white&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Text {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             content: bind scadaData.formatNumber(scadaData.numericDatum)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             font: new Font("Monospaced", "PLAIN", 14)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x: 47&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y: 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             halign: TRAILING&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: bind scadaData.displayColor(scadaData.numericDatum)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Text {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             content: "m3/s"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x: 54&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y: 6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;       },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;       Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         transform: translate(200, 50)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         content:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           [&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: 120&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 55&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             stroke: blue&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: white&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: 100&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: LinearGradient {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               x1: 0, y1: 0, x2: 0, y2: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               stops:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 [Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                   offset: 0.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                   color: red&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                   offset: 0.2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                   color: Color {red: 1.0, green: 0.5, blue: 0.0}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 Stop {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                   offset: 0.4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                   color: Color {red: 0.5, green: 1.0, blue: 0.0}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 }]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 spreadMethod: PAD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: bind 100 - scadaData.numericDatum&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: Color {red: 0.5, green: 0.5, blue: 0.5}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Line {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x1: 23&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y1: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x2: 23&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y2: 110&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             stroke: black&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             transform: translate(23, 10)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             content: foreach (i in [0,20..100])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               Line {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 transform: [translate(0, i)]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 x1: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 y1: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 x2: 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 y2: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 stroke: black&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             transform: translate(32, 10)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             content: foreach (i in [0,20..100])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               Text {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 transform: [translate(0, 100 - i)]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 content: "{i}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 font: new Font("Monospaced", "PLAIN", 8)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 valign: MIDDLE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 halign: LEADING&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;       },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;       Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         transform: translate(50, 200)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         content:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           [&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: 120&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 230&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             stroke: blue&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: white&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y: 35&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: 76&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 181&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: black&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y: 20&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: 15&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 181&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: Color {red: 0.3, green: 0.3, blue: 0.3}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Rect {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             height: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             width: 181&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             fill: Color {red: 0.5, green: 0.5, blue: 0.5}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Line {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x1: 194&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y1: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             x2: 194&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             y2: 110&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             stroke: black&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             transform: translate(194, 10)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             content: foreach (i in [0,20..100])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               Line {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 transform: [translate(0, i)]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 x1: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 y1: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 x2: 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 y2: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 stroke: black&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             transform: translate(203, 10)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             content: foreach (i in [0,20..100])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               Text {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 transform: [translate(0, 100 - i)]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 content: "{i}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 font: new Font("Monospaced", "PLAIN", 8)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 valign: MIDDLE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 halign: LEADING&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           Group {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             transform: translate(10, 10)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;             content: foreach (i in [0..179])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               Line {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 transform: [translate(i, 0)]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 x1: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 y1: bind 100 - scadaData.numericData[i]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 x2: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 y2: bind 100 - scadaData.numericData[i + 1]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 stroke: bind scadaData.displayColor(scadaData.numericData[i + 1])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;                 strokeWidth: 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;               }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;           }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;         ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;     ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt; visible: true&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-5588403708462407590?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/5588403708462407590/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=5588403708462407590' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5588403708462407590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5588403708462407590'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2008/01/javafx-scada-ui.html' title='JavaFX SCADA UI：記録計を作る'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_v58IVq86t4s/R4cXuCHVX7I/AAAAAAAAABM/oGbK09N7UG4/s72-c/JavaFXScadaUI%E7%94%BB%E9%9D%A204.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-312813602756674368</id><published>2007-12-22T14:44:00.000+09:00</published><updated>2008-12-11T09:24:49.028+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：図式指示計を作る</title><content type='html'>続いて、棒図式指示計を作ってみます。こちらの方は、特に言語上問題になる点はありません。&lt;br /&gt;ただの棒図式ではつまらないので、線形階調表示LinearGradientを指定して棒図式を描かせてみました。階調表示の指定が簡単になるよう、棒図式の矩形は固定の高さで描き、背景となる矩形の方の高さを指示計の値に合わせて変えています。&lt;br /&gt;また、目盛線と目盛値は、foreach文を使って生成しています。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_v58IVq86t4s/R2ykxCHVX6I/AAAAAAAAABE/ikosrQaw_V0/s1600-h/JavaFXScadaUI%E7%94%BB%E9%9D%A203.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_v58IVq86t4s/R2ykxCHVX6I/AAAAAAAAABE/ikosrQaw_V0/s320/JavaFXScadaUI%E7%94%BB%E9%9D%A203.jpg" alt="" id="BLOGGER_PHOTO_ID_5146669636465811362" border="0" /&gt;&lt;/a&gt;企画を構築して実行すると枠付き窓が表示され、数値指示計の横に右図のような棒図式指示計が表示されます。&lt;br /&gt;下に載せたプログラムの例では、結果が早く見られるよう、画面の更新間隔を0.5秒にしてあります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import client.ScadaClient;&lt;br /&gt;&lt;br /&gt;class ScadaDataModel {&lt;br /&gt;attribute presenting: Boolean;&lt;br /&gt;attribute timingGenerator: Number;&lt;br /&gt;attribute numericData: Number;&lt;br /&gt;attribute sc: ScadaClient;&lt;br /&gt;function formatNumber(value:Number): String;&lt;br /&gt;operation textColor(value:Number): Color;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute ScadaDataModel.timingGenerator&lt;br /&gt;= bind [1..120] dur 60000 linear continue if presenting;&lt;br /&gt;&lt;br /&gt;function ScadaDataModel.formatNumber(value:Number): String {&lt;br /&gt;return value format as &lt;&lt;##0.00&gt;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;operation ScadaDataModel.textColor(value:Number): Color {&lt;br /&gt;var c:Color = green;&lt;br /&gt;if (value &gt; 90.0) {c = red;}&lt;br /&gt;else if (value &gt; 75.0) {c = Color {red: 1.0, green: 0.5, blue: 0.0};}&lt;br /&gt;return c;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on new ScadaDataModel {&lt;br /&gt;sc = new ScadaClient();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on ScadaDataModel.timingGenerator = value {&lt;br /&gt;numericData = sc.receiveData();&lt;br /&gt;System.out.println("受信生データ: {numericData}");&lt;br /&gt;System.out.println("書式化データ: {formatNumber(numericData)}");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;var scadaData = ScadaDataModel {presenting: true}&lt;br /&gt;title: "JavaFX SCADA UI"&lt;br /&gt;centerOnScreen: true&lt;br /&gt;width: 800&lt;br /&gt;height: 600&lt;br /&gt;background: Color {red: 0.9, green: 0.9, blue: 0.9}&lt;br /&gt;onClose: operation() {System.exit(0);}&lt;br /&gt;content: BorderPanel {&lt;br /&gt;  center: Canvas {&lt;br /&gt;    content:&lt;br /&gt;      [Group {&lt;br /&gt;        transform: translate(50, 50)&lt;br /&gt;        content:&lt;br /&gt;          [Rect {&lt;br /&gt;            height: 18&lt;br /&gt;            width: 50&lt;br /&gt;            arcHeight: 4&lt;br /&gt;            arcWidth: 4&lt;br /&gt;            stroke: blue&lt;br /&gt;            fill: white&lt;br /&gt;          },&lt;br /&gt;          Text {&lt;br /&gt;            content: bind scadaData.formatNumber(scadaData.numericData)&lt;br /&gt;            font: new Font("Monospaced", "PLAIN", 14)&lt;br /&gt;            x: 47&lt;br /&gt;            y: 4&lt;br /&gt;            halign: TRAILING&lt;br /&gt;            fill: bind scadaData.textColor(scadaData.numericData)&lt;br /&gt;          },&lt;br /&gt;          Text {&lt;br /&gt;            content: "m3/s"&lt;br /&gt;            x: 54&lt;br /&gt;            y: 6&lt;br /&gt;          }&lt;br /&gt;        ]&lt;br /&gt;      },&lt;br /&gt;      Group {&lt;br /&gt;        transform: translate(200, 50)&lt;br /&gt;        content:&lt;br /&gt;          [&lt;br /&gt;          Rect {&lt;br /&gt;            height: 120&lt;br /&gt;            width: 55&lt;br /&gt;            stroke: blue&lt;br /&gt;            fill: white&lt;br /&gt;          },&lt;br /&gt;          Rect {&lt;br /&gt;            x: 10&lt;br /&gt;            y: 10&lt;br /&gt;            height: 100&lt;br /&gt;            width: 10&lt;br /&gt;            fill: LinearGradient {&lt;br /&gt;              x1: 0, y1: 0, x2: 0, y2: 1&lt;br /&gt;              stops:&lt;br /&gt;                [Stop {&lt;br /&gt;                  offset: 0.1&lt;br /&gt;                  color: red&lt;br /&gt;                },&lt;br /&gt;                Stop {&lt;br /&gt;                  offset: 0.2&lt;br /&gt;                  color: Color {red: 1.0, green: 0.5, blue: 0.0}&lt;br /&gt;                },&lt;br /&gt;                Stop {&lt;br /&gt;                  offset: 0.4&lt;br /&gt;                  color: Color {red: 0.5, green: 1.0, blue: 0.0}&lt;br /&gt;                }]&lt;br /&gt;                spreadMethod: PAD&lt;br /&gt;              }&lt;br /&gt;          },&lt;br /&gt;          Rect {&lt;br /&gt;            x: 10&lt;br /&gt;            y: 10&lt;br /&gt;            height: bind 100 - scadaData.numericData&lt;br /&gt;            width: 10&lt;br /&gt;            fill: Color {red: 0.5, green: 0.5, blue: 0.5}&lt;br /&gt;          },&lt;br /&gt;          Line {&lt;br /&gt;            x1: 23&lt;br /&gt;            y1: 10&lt;br /&gt;            x2: 23&lt;br /&gt;            y2: 110&lt;br /&gt;            stroke: black&lt;br /&gt;          },&lt;br /&gt;          Group {&lt;br /&gt;            transform: translate(23, 10)&lt;br /&gt;            content: foreach (i in [0,20..100])&lt;br /&gt;              Line {&lt;br /&gt;                transform: [translate(0, i)]&lt;br /&gt;                x1: 0&lt;br /&gt;                y1: 0&lt;br /&gt;                x2: 3&lt;br /&gt;                y2: 0&lt;br /&gt;                stroke: black&lt;br /&gt;              }&lt;br /&gt;          },&lt;br /&gt;          Group {&lt;br /&gt;            transform: translate(34, 10)&lt;br /&gt;            content: foreach (i in [0,20..100])&lt;br /&gt;              Text {&lt;br /&gt;                transform: [translate(0, 100 - i)]&lt;br /&gt;                content: "{i}"&lt;br /&gt;                font: new Font("Monospaced", "PLAIN", 8)&lt;br /&gt;                valign: MIDDLE&lt;br /&gt;                halign: LEADING&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;        ]&lt;br /&gt;      }&lt;br /&gt;    ]&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;visible: true&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-312813602756674368?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/312813602756674368/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=312813602756674368' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/312813602756674368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/312813602756674368'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx-scada-ui_22.html' title='JavaFX SCADA UI：図式指示計を作る'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_v58IVq86t4s/R2ykxCHVX6I/AAAAAAAAABE/ikosrQaw_V0/s72-c/JavaFXScadaUI%E7%94%BB%E9%9D%A203.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-2477173577611802963</id><published>2007-12-20T12:16:00.000+09:00</published><updated>2008-12-11T09:24:49.232+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：数値指示計を作る</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;Javaプログラムから受け取った実数値を、JavaFXプログラムで書式設定して表示することができました。そこで、ごく簡単な数値表示器を仕立て、枠付き窓の適当な位置に配置してみたいと思います。&lt;br /&gt;実数値を表示する文字列Text、その背景となる矩形Rect、および単位を表示する文字列Textを、Groupで組にし、アフィン変換&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;transformを指定して、画面上の任意の位置に配置します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;実数値に設定した書式は固定幅ではないので、Textのhalign属性にTRAILINGを指定し、文字列の末尾（文字列を囲む矩形の右上隅の点）を座標指定の基準点とします。&lt;br /&gt;また、数値指示計に表示される文字は、等幅の書体の方が読みやすいので、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Textのfont属性にはMonospacedのＦｏｎｔを生成して設定しています。&lt;br /&gt;ただ数値を表示するだけでは面白くないので、数値が上限値と上上限値を超えると、表示色が緑から橙、赤と変わるようにしてみました。「上上限値」という言い方は計測制御の分野独特のもので、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;上限値を&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;2段階に設け、その上の方の上限値をさします（同様に、下の方の下限値は「下下限値」と言います）。英語だとなんと言うんでしょうね。「Upper maximum」では、ちょっと意味が違うし…。&lt;br /&gt;ScadaDataModelクラスにtextColor()操作を定義し、引数で渡された値によって、3種類の色オブジェクトColorを返すようにしました。この操作をTextオブジェクトのfill属性に結合し、数値にあわせてその表示色を変えています。&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_v58IVq86t4s/R2o1NCHVX5I/AAAAAAAAAA8/_B2z26LEbHg/s1600-h/JavaFXScadaUI%E7%94%BB%E9%9D%A202.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_v58IVq86t4s/R2o1NCHVX5I/AAAAAAAAAA8/_B2z26LEbHg/s320/JavaFXScadaUI%E7%94%BB%E9%9D%A202.jpg" alt="" id="BLOGGER_PHOTO_ID_5145984022246416274" border="0" /&gt;&lt;/a&gt;企画を構築して実行すると、枠付き窓が表示され、その左上の方に右図のような簡易数値指示計が表示されます。&lt;br /&gt;等幅の書体を指定したので、小数点もそれなりの幅を持って表示されます。しかし、表示を繰り返していると、なぜか数値表示の部分だけが左右に微妙にぶれてしまいます。ＪａｖａＦＸも、細かい点での改良の余地は、まだまだありそうですね。&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;いつもどおり、最後に源コードを載せておきます。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import client.ScadaClient;&lt;br /&gt;&lt;br /&gt;class ScadaDataModel {&lt;br /&gt;attribute presenting: Boolean;&lt;br /&gt;attribute timingGenerator: Number;&lt;br /&gt;attribute numericData: Number;&lt;br /&gt;attribute sc: ScadaClient;&lt;br /&gt;function formatNumber(value:Number): String;&lt;br /&gt;operation textColor(value:Number): Color;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute ScadaDataModel.timingGenerator&lt;br /&gt;= bind [1..60] dur 60000 linear continue if presenting;&lt;br /&gt;&lt;br /&gt;function ScadaDataModel.formatNumber(value:Number): String {&lt;br /&gt;return value format as &lt;&lt;##0.00&gt;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;operation ScadaDataModel.textColor(value:Number): Color {&lt;br /&gt;var c:Color = green;&lt;br /&gt;if (value &gt; 10.0) {c = red;}&lt;br /&gt;else if (value &gt; 5.0) {c = Color {red: 1.0, green: 0.5, blue: 0.0};}&lt;br /&gt;return c;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on new ScadaDataModel {&lt;br /&gt;sc = new ScadaClient();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on ScadaDataModel.timingGenerator = value {&lt;br /&gt;numericData = sc.receiveData();&lt;br /&gt;System.out.println("受信生データ: {numericData}");&lt;br /&gt;System.out.println("書式化データ: {formatNumber(numericData)}");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;var scadaData = ScadaDataModel {presenting: true}&lt;br /&gt;title: "JavaFX SCADA UI"&lt;br /&gt;centerOnScreen: true&lt;br /&gt;width: 800&lt;br /&gt;height: 600&lt;br /&gt;background: Color {red: 0.9, green: 0.9, blue: 0.9}&lt;br /&gt;onClose: operation() {System.exit(0);}&lt;br /&gt;content: BorderPanel {&lt;br /&gt;center: Canvas {&lt;br /&gt;  content:&lt;br /&gt;    [Group {&lt;br /&gt;      transform: translate(50, 50)&lt;br /&gt;      content:&lt;br /&gt;        [Rect {&lt;br /&gt;          height: 18&lt;br /&gt;          width: 50&lt;br /&gt;          arcHeight: 4&lt;br /&gt;          arcWidth: 4&lt;br /&gt;          stroke: blue&lt;br /&gt;          fill: white&lt;br /&gt;        },&lt;br /&gt;        Text {&lt;br /&gt;          content: bind scadaData.formatNumber(scadaData.numericData)&lt;br /&gt;          font: new Font("Monospaced", "PLAIN", 14)&lt;br /&gt;          x: 47&lt;br /&gt;          y: 4&lt;br /&gt;          halign: TRAILING&lt;br /&gt;          fill: bind scadaData.textColor(scadaData.numericData)&lt;br /&gt;        },&lt;br /&gt;        Text {&lt;br /&gt;          content: "m3/s"&lt;br /&gt;          x: 54&lt;br /&gt;          y: 6&lt;br /&gt;        }]&lt;br /&gt;    }]&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;visible: true&lt;br /&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-2477173577611802963?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/2477173577611802963/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=2477173577611802963' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2477173577611802963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2477173577611802963'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx-scada-ui_20.html' title='JavaFX SCADA UI：数値指示計を作る'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_v58IVq86t4s/R2o1NCHVX5I/AAAAAAAAAA8/_B2z26LEbHg/s72-c/JavaFXScadaUI%E7%94%BB%E9%9D%A202.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1869881752464767614</id><published>2007-12-19T12:04:00.000+09:00</published><updated>2008-12-11T09:24:49.567+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：UIプログラムで数値を表示する</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;Javaで記述した模擬依頼者プログラムから、UIプログラムへSCADA情報（実数値）を渡す準備ができました。そこで、JavaFXでUIプログラムを記述して、それを枠付き窓に数値表&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;示させることにします。&lt;br /&gt;数値は、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFXの書式設定演算子formatを利用して、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;小数点以下第2位までの表示とします。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;書式として、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「##0.00」形式を指定しました。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;丸め方法も指定できると良かったのですが、現状のJavaFXではそこまで記述できません&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Javaでは数値の書式として、「%m.nf」形式で全体の桁数と小数点以下の桁数を指定することができます。JavaFXでもこの書式を使えないわけではありません。UIの窓に数値指示計として表示するには、こちらの方が都合はいいです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;しかし、現状では&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「%m.nf」形式の使用に&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;いろいろと制限がついてしまいます。私のプログラムでは、置換引金の処理で、Javaプ&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ログラムから数値を読み込んでいます。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「%m.nf」形式を有効にするためには、この区画の中でJavaクラスの実体を生成し、その参照変数を介して実体手続きを呼び出すようにするか、実体を生成したくない場合は、クラス手続きを呼び出すようにしなければなりません&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。そうしないと、「illegal format specifier %8.2f」のような誤りになってしまいます。&lt;br /&gt;更に、そうして&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「%m.nf」形式で書式を設定しても、それを割り当てる図形要素によって、書式が有効になるものとならないものがあります。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Label要素&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;では有効ですが、Text要素では無効で、頭の空白文字は無視されてしまいます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;今回の例では、書式指定が利用できることを示すために、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Label要素を使用していますので、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「%m.nf」形式を指定しても問題はありません。しかし&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;、後で、文字列を図形や画像と組み合わせて表示できるよう、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Text要素を使うつもりですので、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「%m.nf」形式&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;は使用しませんでした。&lt;br /&gt;前説が長くなりましたが、プログラムの作成に話を進めます。&lt;a href="http://terrasweblog.blogspot.com/2007/12/javafx-scada-ui_18.html"&gt;12月18日の投稿&lt;/a&gt;で作成した「Javaアプリケーションプロジェクト」内に、UIプログラム用のJavaFXファイルを作成します。以前に紹介した目覚まし時計のプログラムでは、JavaとJavaFXの企画（Project）を分けました。今回は、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;同じJava企画&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;にJavaFXプログラムも記述します。その方が、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;構築作業が楽になります。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;私は、「ScadaClientUI」という名前でJavaFXファイルを作成しました。ファイルを作成したら、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;企画名&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;をマウスで右押しし、表示される状況目録から、「プロパティー」を選択します。表示された窓の「カテゴリ」から「実行」を選択し、右側に表示された「引数」文字列枠に、作成したJavaFXのファイル名を包み名付きで設定します。私は、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;包み名を「client」&lt;/span&gt;としましたので、「&lt;span style="font-family:lucida grande;"&gt;client.&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ScadaClientUI&lt;/span&gt;」と設定しました。&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;ページの最後にコードを載せておきます。なお、目覚まし時計と同様に、編集用具上では「import client.ScadaClient;」の「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ScadaClient&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;」の部分に、誤りを示す赤い波線が表示されますが、無視します。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;企画&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を構築して実行すると、次のように、出力窓と枠付き窓に書式化された数値が、1秒ごとに表示されます（ときどき、表示の更新が欠落することがありますが、そこはご愛嬌ということで）。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_v58IVq86t4s/R2igMiHVX3I/AAAAAAAAAAs/APqOe_q-7S0/s1600-h/JavaFXScadaUI%E7%94%BB%E9%9D%A201.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_v58IVq86t4s/R2igMiHVX3I/AAAAAAAAAAs/APqOe_q-7S0/s320/JavaFXScadaUI%E7%94%BB%E9%9D%A201.jpg" alt="" id="BLOGGER_PHOTO_ID_5145538711447232370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import client.ScadaClient;&lt;br /&gt;&lt;br /&gt;class ScadaDataModel {&lt;br /&gt;attribute presenting: Boolean;&lt;br /&gt;attribute timingGenerator: Number;&lt;br /&gt;attribute numericData: Number;&lt;br /&gt;attribute sc: ScadaClient;&lt;br /&gt;function formatNumber(value:Number): String;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute ScadaDataModel.timingGenerator&lt;br /&gt;= bind [1..60] dur 60000 linear continue if presenting;&lt;br /&gt;&lt;br /&gt;function ScadaDataModel.formatNumber(value:Number): String {&lt;br /&gt;return value format as &lt;&lt;##0.00&gt;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on new ScadaDataModel {&lt;br /&gt;sc = new ScadaClient();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on ScadaDataModel.timingGenerator = value {&lt;br /&gt;numericData = sc.receiveData();&lt;br /&gt;System.out.println("受信生データ: {numericData}");&lt;br /&gt;System.out.println("書式化データ: {formatNumber(numericData)}");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;var scadaData = ScadaDataModel {presenting: true}&lt;br /&gt;title: "JavaFX SCADA UI"&lt;br /&gt;centerOnScreen: true&lt;br /&gt;width: 400&lt;br /&gt;height: 200&lt;br /&gt;onClose: operation() {System.exit(0);}&lt;br /&gt;content: Label {&lt;br /&gt;       text: bind scadaData.formatNumber(scadaData.numericData)&lt;br /&gt;}&lt;br /&gt;visible: true&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1869881752464767614?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1869881752464767614/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1869881752464767614' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1869881752464767614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1869881752464767614'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx-scada-uiui.html' title='JavaFX SCADA UI：UIプログラムで数値を表示する'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_v58IVq86t4s/R2igMiHVX3I/AAAAAAAAAAs/APqOe_q-7S0/s72-c/JavaFXScadaUI%E7%94%BB%E9%9D%A201.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-823147398062122668</id><published>2007-12-18T12:03:00.000+09:00</published><updated>2007-12-19T14:24:16.514+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：模擬依頼者を作る</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;これから、JavaFXでSCADAのUIプログラムを構築していきます。最初に、UIプログラムにSCADA情報を提供する依頼者&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の処理を模擬するプログラム&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を、Javaで作ります。&lt;br /&gt;依頼者からUIプログラムへは倍精度浮動小数点数の模擬情報を渡し、UIプログラムで数値指示計や図式指示計などにその値を数値や図式として表示させます。値は何でも良いのですが、とりあえず正弦関数の絶対値を100倍して渡すことにしました。依頼者の手続きが呼び出されるたびに、正弦関数の角度を1度ずつ増やして計算します。&lt;br /&gt;まず、NetBeansで「Javaアプリケーションプロジェクト」（名前は任意）を作成します。同様に任意の「パッケージ&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;名&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;」と&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「クラス名」&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;を指定して、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Javaクラスを作成します。私は、パッケージ名に&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「client」、クラス名に「ScadaClient」を指定しました。&lt;br /&gt;Javaクラスには実体手続きを定義し、上記の値を計算して戻り値として返すようにしました。また、主手続きで、作成した実体手続きの動作確認を行っています。&lt;br /&gt;私が作成したコードを、最後に載せておきます（例によって、字下げが消えてるため、読みづらくてすみません）。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Javaアプリケーション&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;プロジェクトを構築・実行すると、0～4度までの&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;5つの&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;正弦関数値が、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;出力窓に&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;表示されます。&lt;br /&gt;&lt;br /&gt;package client;&lt;br /&gt;&lt;br /&gt;public class ScadaClient {&lt;br /&gt;&lt;br /&gt;// 模擬SCADAデータ生成用作業変数。&lt;br /&gt;private int i = -1;&lt;br /&gt;&lt;br /&gt;public double receiveData() {&lt;br /&gt;  // 模擬SCADAデータを生成して返す。&lt;br /&gt;  i += 1;&lt;br /&gt;  if (i &gt;= 360) {&lt;br /&gt;    i = 0;&lt;br /&gt;  }&lt;br /&gt;  return (double)(Math.abs(Math.sin(i * Math.PI / 180.0) * 100));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;  ScadaClient sc = new ScadaClient();&lt;br /&gt;  for (int i = 0; i &lt;&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-823147398062122668?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/823147398062122668/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=823147398062122668' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/823147398062122668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/823147398062122668'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx-scada-ui_18.html' title='JavaFX SCADA UI：模擬依頼者を作る'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1826282792773619782</id><published>2007-12-17T17:13:00.000+09:00</published><updated>2007-12-17T18:21:20.860+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='SCADA'/><title type='text'>JavaFX SCADA UI：はじめに</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;&lt;a href="http://terrasweblog.blogspot.com/2007/12/javafx_02.html"&gt;前に&lt;/a&gt;、目覚まし時計を作りましたので、次は、SCADAのUIをJavaFXで作ってみたいと思います。&lt;br /&gt;そもそも、JavaFXを含め、RIAの調査を始めたきっかけが、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADAのUIをAppletよりも簡単かつ表現力豊かに構築する方法はないかということでしたので、ようやく本題に突入と言ったところでしょうか。&lt;br /&gt;SCADAとは、「Supervisory Control And Data Acquisition」の頭文字をとったもので、日本では「遠隔監視制御システム」などと呼ばれています。その名のとおり、諸所に分散した施設の設備や機器の運転情報を収集して処理するとともに、運転制御をも行う機構です&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（監視だけを行うものもあります）&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;。&lt;br /&gt;関連する技術分野が多方面に及ぶ（分散処理、画像処理、データベース、AI、電子郵便、携帯端末、RAS、などなど、数え上げると切りがない）ため、プログラミングの題材としては、なかなか面白いものです。&lt;br /&gt;機構全体としては、かなり膨大なものになりうるのですが、ここではその内のUI部分を（それも、かなり単純化して）構築することにします。したがって、SCADA役務の依頼者と提供者間の通信の実現方法については考慮しません。何らかの方法で依頼者は&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;SCADA&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;役務の提供を受けることができる、という前提で作成します。&lt;br /&gt;例によって、開発環境としてNeｔBeansを使います。「それでは、…」と言いたいところですが、今日は前置きで終わりです。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1826282792773619782?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1826282792773619782/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1826282792773619782' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1826282792773619782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1826282792773619782'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx-scada-ui.html' title='JavaFX SCADA UI：はじめに'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-2097928399599799322</id><published>2007-12-16T12:34:00.000+09:00</published><updated>2007-12-16T12:52:33.027+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFX安定版の公開時期</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;JavaFX共同体討論場に載せられていた投稿によると、JavaFXのある程度の安定版公開時期は、来年のJavaOneのころになるようです。&lt;br /&gt;今は、その黎明期の姿を垣間見ることができる、貴重なときなのかもしれません。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-2097928399599799322?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/2097928399599799322/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=2097928399599799322' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2097928399599799322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2097928399599799322'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx_16.html' title='JavaFX安定版の公開時期'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-8784616072907966666</id><published>2007-12-13T14:19:00.000+09:00</published><updated>2007-12-13T15:05:45.235+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>SunもJavaFX用GUI構築用具を開発中</title><content type='html'>&lt;span style="font-family: lucida grande;"&gt;ベルギーで開催されたJavaPolis 2007（ヨーロッパ版のJavaOne）において、SunのJames Gosling氏が基調講演を行い、SunがJavaFX用のGUI構築用具の原型版を開発中であることを披露されました。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;JavaFXにおける&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;GUI&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;プログラミング&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;は、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;Javaにおけるそれよりはるかに容易になったとはいえ、やはりGUIはWYSIWYGで設計したいものです。NetBeansのMatisseようなGUI構築用具を一度使うと、正直、&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;WYSIWYGで編集できないのはつらいものがあります。&lt;br /&gt;JavaFX用のGUI&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;構築用具としては、ご存知のように、JFXBuilderというお試し用具もあるようですが、Sunのものはどのような機能を提供してくれるのか、今から楽しみです。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-8784616072907966666?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/8784616072907966666/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=8784616072907966666' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8784616072907966666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/8784616072907966666'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/sunjavafxgui.html' title='SunもJavaFX用GUI構築用具を開発中'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-5933491020404176079</id><published>2007-12-11T20:11:00.000+09:00</published><updated>2007-12-11T21:22:16.567+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXファイルでJavaクラスを輸入するときはご注意を</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;現状の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;逐次解釈（Interpreter）版の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;JavaFXプログラムで、Javaのクラスを輸入（import）して使うときは、ちょっと注意が必要です。&lt;br /&gt;少なくとも現状の逐次解釈版のJavaFX（一括変換（Compiler）版では調べていません）プログラムでは、java.lang.Systemクラスなどを輸入して使う場合、包み（Package）全体の輸入宣言「import java.lang.*;」で済ますと、思わぬ誤動作をすることがありますので注意が必要です。&lt;br /&gt;私が経験した事例では、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;java.lang包みの輸入宣言を行っているプログラムで、クラスに数値（Number）型の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;属性を定義し、その属性に実数を格納したときに、その整数部分しか格納されないというものでした（同じプログラム内で、クラス属性ではなく、数値型として&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;var&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;宣言した変数には実数として格納されるので、ややこしい）。&lt;br /&gt;いろいろ調べた結果、包み全体ではなく、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;java.lang.Systemクラスを明示的に宣言することで、この不具合が解消されることが分かりました。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;もともと、Javaのプログラムでも、包み全体ではなく、なるべく個々のクラスごとに輸入宣言を記述する方が良いとはされていますが、包み全体の輸入を宣言してもプログラムが&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;誤&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;動作をすることはありません。ですから&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;、包みの宣言でも正常に動作するのが、本来の姿だとは思いますが。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-5933491020404176079?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/5933491020404176079/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=5933491020404176079' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5933491020404176079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/5933491020404176079'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafxjava.html' title='JavaFXファイルでJavaクラスを輸入するときはご注意を'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3426920697248118628</id><published>2007-12-08T12:03:00.000+09:00</published><updated>2007-12-08T12:40:20.432+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX言語の展開：置換引金の定義場所と構文の変更</title><content type='html'>これまで、クラス属性の置換引金はクラス本体の外で定義していましたが、これからは、クラス属性の宣言の一部として記述するようになります。そして、置換引金の構文も、鍵語が「trigger on」から「&lt;span class="wikiwyg_section" id="wikiwyg_section_3"&gt;on replace&lt;/span&gt;」へと、置換処理の定義であることを明示したものに変わります。&lt;br /&gt;（旧）&lt;br /&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_3"&gt;&lt;pre&gt;class Foo {&lt;br /&gt;     attribute bar: Boolean = true;&lt;br /&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_3"&gt;&lt;/span&gt;}&lt;br /&gt;trigger on Foo.bar = value {&lt;br /&gt;     if (bar == true) {&lt;br /&gt;         beep();&lt;br /&gt;     }&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;（新）&lt;span class="wikiwyg_section" id="wikiwyg_section_3"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_3"&gt;&lt;pre&gt;class Foo {&lt;br /&gt;     attribute bar: Boolean = true on replace {&lt;br /&gt;         if (bar == true) {&lt;br /&gt;             beep();&lt;br /&gt;         }&lt;br /&gt;     };&lt;br /&gt; }&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3426920697248118628?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3426920697248118628/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3426920697248118628' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3426920697248118628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3426920697248118628'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx_08.html' title='JavaFX言語の展開：置換引金の定義場所と構文の変更'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4337399484653777664</id><published>2007-12-07T11:14:00.000+09:00</published><updated>2007-12-08T12:28:07.329+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX言語の展開：クラス属性の初期値の設定場所</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;これまで、クラスの属性（&lt;/span&gt;attribute&lt;span style="font-family:lucida grande;"&gt;）が初期値を持つ場合、クラス本体の外でその設定を行っていました。これからは、Javaのように、クラスの本体内で属性の宣言と初期値の設定を行うようになります。&lt;br /&gt;（旧）&lt;br /&gt;&lt;/span&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_2"&gt;&lt;pre&gt;class Foo {&lt;br /&gt;    attribute bar: Boolean;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute Foo.bar = true;&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（新）&lt;br /&gt;&lt;/span&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_2"&gt;&lt;pre&gt;class Foo {&lt;br /&gt;    attribute bar: Boolean = true;&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4337399484653777664?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4337399484653777664/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4337399484653777664' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4337399484653777664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4337399484653777664'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx_07.html' title='JavaFX言語の展開：クラス属性の初期値の設定場所'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3561724576908632571</id><published>2007-12-06T12:11:00.000+09:00</published><updated>2007-12-22T15:54:09.105+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ＪａｖａＦＸ言語'/><title type='text'>JavaFX言語の展開：関数と操作の統合</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;11月27日の投稿でも少しふれましたが、ＪａｖａＦＸ言語も、コンパイラのサポートとともに、より明快で使いやすいものへと発展しようとしています。&lt;br /&gt;そこで、ＪａｖａＦＸはどのように変わるのか、ということについて検討中の話題も含めて整理しておきたいと思います。&lt;br /&gt;まずは、「functionとoperationの統合」についてです。&lt;br /&gt;現状のインタプリタ版では、手続きの記述方法として関数（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;function&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;）と操作（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;operation&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;）の２つが用意されています。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;関数&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;は、return文を用いて必ず値を返し、結合演算子（bind）を&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;明示的に指定しなくても、その本体は差分評価（&lt;/span&gt;incremental evaluation&lt;span style="font-family:lucida grande;"&gt;）されます。それに対して、操作の方は、必ずしも値を返す必要がなく、関数では使えない制御文が使えます。その代わり、操作の本体は関数のように暗黙的に&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;差分&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;評価されることはありません。&lt;br /&gt;しかし、手続きとして関数と操作の２種類があると紛らわしいので、次のように関数&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;に統合されることになります（「旧」はこれまでのインタプリタ版で用いられていた構文を、「新」はコンパイラ版で&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;新しく&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;適用される構文を意味します）。&lt;br /&gt;（旧）&lt;br /&gt;&lt;/span&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_1"&gt;&lt;pre&gt;class Foo {&lt;br /&gt; function times2(x) { return x * 2; }&lt;br /&gt; operation print(s) { System.out.println(s); }&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（新）&lt;br /&gt;&lt;/span&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_1"&gt;&lt;pre&gt;class Foo {&lt;br /&gt; function times2(x) { return x * 2; }&lt;br /&gt; function print(s)  { System.out.println(s); }&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3561724576908632571?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3561724576908632571/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3561724576908632571' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3561724576908632571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3561724576908632571'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafxfunctionoperation.html' title='JavaFX言語の展開：関数と操作の統合'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1797144921954093747</id><published>2007-12-05T11:51:00.000+09:00</published><updated>2008-12-11T09:24:50.128+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXでアラーム時計を作る（完成で～す！）</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_v58IVq86t4s/R1YTYEe4ZdI/AAAAAAAAAAc/ipT4pA3Gxm8/s1600-h/%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%A0%E6%99%82%E8%A8%88%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_v58IVq86t4s/R1YTYEe4ZdI/AAAAAAAAAAc/ipT4pA3Gxm8/s200/%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%A0%E6%99%82%E8%A8%88%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8.jpg" alt="" id="BLOGGER_PHOTO_ID_5140317328931055058" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family: lucida grande;"&gt;タイマの残り時間が０になるとアラームが鳴るようになりましたので、タイマの時間をＵＩから設定できるようにします。また、タイマが作動中に電話などの割り込みが入ったときは、カウントダウンを一時中断できるようにもしてみます。&lt;br /&gt;完成したタイマのウィンドウイメージは、右の図のようになります（昔よく見かけた柱時計みたいになってしまいました）。&lt;br /&gt;タイマの時間をスピナで設定し、スタートボタンを押すとカウントダウンを開始し、ストップボタンを押すとカウントダウンを停止します。時間設定のスピナは、残り時間のディジタル表示器の役目もしてくれます。&lt;br /&gt;コード自体は、いたってシンプルなので、&lt;/span&gt;&lt;a href="https://openjfx.dev.java.net/ja/JavaFX_Programming_Language.html"&gt;JavaFX Script プログラミング言語 リファレンス&lt;/a&gt;&lt;span style="font-family: lucida grande;"&gt;や&lt;/span&gt;&lt;a href="https://openjfx.dev.java.net/ja/Learning_More_About_JavaFX.html"&gt;深く学ぼう JavaFX Script 言語&lt;/a&gt;&lt;span style="font-family: lucida grande;"&gt;を参考に読んでいただければ、何を行っているかすぐ分かると思います。&lt;br /&gt;と言うわけで、ごちゃごちゃ書かずに、変更版の&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;アラーム時計&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;ＪａｖａＦＸファイル&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;「AlarmClock.fx」のソースコード全体を載せてしまいます。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;package timer;&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import timer.Sound;&lt;br /&gt;&lt;br /&gt;public class Timer {&lt;br /&gt;  private attribute elapsed: Number;&lt;br /&gt;  public attribute seconds: Number;&lt;br /&gt;  public attribute minutes: Integer;&lt;br /&gt;  public attribute hours: Integer;&lt;br /&gt;  public attribute count: Number;&lt;br /&gt;  public attribute startTime: Number;&lt;br /&gt;  public attribute elapsedTime: Number;&lt;br /&gt;  public attribute remainingTime: Number;&lt;br /&gt;  public attribute running: Boolean;&lt;br /&gt;  public attribute alarmEnabled: Boolean;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute Timer.elapsed = bind if running&lt;br /&gt;  then [1..10] dur 1000 linear while running continue if running&lt;br /&gt;  else 0;&lt;br /&gt;&lt;br /&gt;trigger on Timer.elapsed = value {&lt;br /&gt;  var now = new Date();&lt;br /&gt;  elapsedTime = now.getTime() / 1000 - startTime;&lt;br /&gt;  remainingTime = count - elapsedTime;&lt;br /&gt;  running = if (elapsedTime &gt;= count) then false else running;&lt;br /&gt;  seconds = remainingTime % 60;&lt;br /&gt;  minutes = ((Integer)remainingTime / 60) % 60;&lt;br /&gt;  hours = ((Integer)remainingTime / 60) / 60;&lt;br /&gt;  hours = if (elapsedTime &gt;= count) then 0 else hours;&lt;br /&gt;  minutes = if (elapsedTime &gt;= count) then 0 else minutes;&lt;br /&gt;  seconds = if (elapsedTime &gt;= count) then 0 else seconds;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on Timer.running = value {&lt;br /&gt;  if ((alarmEnabled == true) and (remainingTime &lt;= 0)) {&lt;br /&gt;      alarmEnabled = false;&lt;br /&gt;      Sound.alarm();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;  var t = Timer {seconds:0, minutes:0, hours:0, count:0,&lt;br /&gt;      running:false, alarmEnabled:false}&lt;br /&gt;  title: "JavaFX アラーム"&lt;br /&gt;  height: 350&lt;br /&gt;  width: 215&lt;br /&gt;  onClose: operation() {System.exit(0);}&lt;br /&gt;  content: BorderPanel {&lt;br /&gt;    center: Canvas {&lt;br /&gt;      content:&lt;br /&gt;        Group {&lt;br /&gt;          var font = new Font("Dialog", "PLAIN", 15)&lt;br /&gt;          var secs = bind t.seconds&lt;br /&gt;          var mins = bind t.minutes + secs / 60&lt;br /&gt;          var hrs = bind t.hours + mins / 60&lt;br /&gt;          content:&lt;br /&gt;            [Rect {&lt;br /&gt;              height: 400&lt;br /&gt;              width: 225&lt;br /&gt;              fill: Color {red:0.9, green:0.9, blue:0.9}&lt;br /&gt;            },&lt;br /&gt;            Circle {cx: 100, cy: 100, radius: 80, fill: white, stroke: black, strokeWidth: 1},&lt;br /&gt;            Group {&lt;br /&gt;              transform: translate(100, 100)&lt;br /&gt;              content: foreach (i in [1..12])&lt;br /&gt;                Text {&lt;br /&gt;                  var radians = Math.toRadians(30 * i - 90)&lt;br /&gt;                  transform: [translate((70 * Math.cos(radians)), (70 * Math.sin(radians)))]&lt;br /&gt;                  content: "{i}"&lt;br /&gt;                  valign: MIDDLE&lt;br /&gt;                  halign: CENTER&lt;br /&gt;                }&lt;br /&gt;            },&lt;br /&gt;            Group {&lt;br /&gt;              transform: translate(100, 100)&lt;br /&gt;              var hourHand =&lt;br /&gt;                  Line {x1: 0, y1: 0, x2: 0, y2: -35,&lt;br /&gt;                      strokeWidth: 4, stroke: black&lt;br /&gt;                      transform: bind rotate((hrs * 30), 0, 0)&lt;br /&gt;                  }&lt;br /&gt;              var minuteHand =&lt;br /&gt;                  Line {x1: 0, y1: 0, x2: 0, y2: -55,&lt;br /&gt;                      strokeWidth: 2, stroke: blue,&lt;br /&gt;                      transform: bind rotate((mins * 6), 0, 0)&lt;br /&gt;                  }&lt;br /&gt;              var secondHand =&lt;br /&gt;                  Line {x1: 0, y1: 0, x2: 0, y2: -75,&lt;br /&gt;                      strokeWidth: 1, stroke: red,&lt;br /&gt;                      transform: bind rotate((t.seconds * 6), 0, 0)&lt;br /&gt;                  }&lt;br /&gt;              content: [hourHand, minuteHand, secondHand]&lt;br /&gt;            },&lt;br /&gt;            Circle {cx: 100, cy: 100, radius: 3, fill: black, stroke: black }]&lt;br /&gt;        },&lt;br /&gt;    }&lt;br /&gt;    bottom: Box {&lt;br /&gt;      background: white&lt;br /&gt;      orientation: VERTICAL&lt;br /&gt;      content:&lt;br /&gt;        [FlowPanel {&lt;br /&gt;          content:&lt;br /&gt;            [Spinner {&lt;br /&gt;              enabled: bind not(t.running)&lt;br /&gt;              min: 0&lt;br /&gt;              max: 23&lt;br /&gt;              value: bind t.hours&lt;br /&gt;            },&lt;br /&gt;            SimpleLabel {&lt;br /&gt;              enabled: bind not(t.running)&lt;br /&gt;              text: "時"&lt;br /&gt;            }]&lt;br /&gt;          },&lt;br /&gt;          FlowPanel {&lt;br /&gt;            content:&lt;br /&gt;              [Spinner {&lt;br /&gt;              enabled: bind not(t.running)&lt;br /&gt;              min: 0&lt;br /&gt;              max: 59&lt;br /&gt;              value: bind t.minutes&lt;br /&gt;            },&lt;br /&gt;            SimpleLabel {&lt;br /&gt;              enabled: bind not(t.running)&lt;br /&gt;              text: "分"&lt;br /&gt;            }]&lt;br /&gt;          },&lt;br /&gt;          FlowPanel {&lt;br /&gt;            content:&lt;br /&gt;              [Spinner {&lt;br /&gt;                enabled: bind not(t.running)&lt;br /&gt;              min: 0&lt;br /&gt;              max: 59&lt;br /&gt;              value: bind t.seconds&lt;br /&gt;            },&lt;br /&gt;            SimpleLabel {&lt;br /&gt;              enabled: bind not(t.running)&lt;br /&gt;              text: "秒"&lt;br /&gt;            }]&lt;br /&gt;          },&lt;br /&gt;          FlowPanel {&lt;br /&gt;            content:&lt;br /&gt;              [Button {&lt;br /&gt;                enabled: bind t.running&lt;br /&gt;                text: "ストップ"&lt;br /&gt;                action: bind operation() {&lt;br /&gt;                  t.running = false;&lt;br /&gt;                }&lt;br /&gt;              },&lt;br /&gt;              RigidArea {&lt;br /&gt;                width: 20&lt;br /&gt;              },&lt;br /&gt;              Button {&lt;br /&gt;                enabled: bind not(t.running)&lt;br /&gt;                text: "スタート"&lt;br /&gt;                action: operation() {&lt;br /&gt;                  var date = new Date();&lt;br /&gt;                  t.count = t.hours * 3600 + t.minutes * 60 + t.seconds;&lt;br /&gt;                  t.startTime = date.getTime() / 1000;&lt;br /&gt;                  t.remainingTime = t.count;&lt;br /&gt;                  if (t.count &lt;&gt; 0) {&lt;br /&gt;                    t.alarmEnabled = true;&lt;br /&gt;                    t.running = true;&lt;br /&gt;                  }&lt;br /&gt;                }&lt;br /&gt;              }]&lt;br /&gt;          }]&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  visible: true&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1797144921954093747?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1797144921954093747/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1797144921954093747' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1797144921954093747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1797144921954093747'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx_05.html' title='JavaFXでアラーム時計を作る（完成で～す！）'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_v58IVq86t4s/R1YTYEe4ZdI/AAAAAAAAAAc/ipT4pA3Gxm8/s72-c/%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%A0%E6%99%82%E8%A8%88%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-16491345360159046</id><published>2007-12-04T12:30:00.000+09:00</published><updated>2008-12-11T09:24:50.355+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXでアラーム時計を作る（3）</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;アラーム音再生やメッセージ表示の準備ができたので、ＪａｖａＦＸのプログラムからこれを呼び出せるようにしてみます（以降、いずれもＮｅｔＢｅａｎｓで作業を行う場合を例に記述しています）。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;作成したアラーム出力&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Ｊａｖａ&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;アプリケーションプロジェクトの、&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「〈プロジェクト名〉\build\classes\〈パッケージ名〉\」&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ディレクトリの下に構築されたクラスファイル（私の場合は、「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;Sound.&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;.class」）と、コピーしておいたサウンドファイル（同様に、「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;TestMusic.wav&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;」）を、ともに、アラーム時計&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ＪａｖａＦＸアプリケーションプロジェクトの方の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;「〈プロジェクト名〉\build\classes\〈パッケージ名〉\」ディレクトリの下にコピーします。&lt;br /&gt;そして、１２月２日の投稿で紹介した上記のアラーム時計&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ＪａｖａＦＸファイル（同じく「&lt;/span&gt;AlarmClock.fx&lt;span style="font-family:lucida grande;"&gt;」）に、以下の変更を加えます。&lt;br /&gt;まず、アラーム出力クラスのインポート文を追加します（以下、いずれも私が指定したパッケージ名やファイル名で記述します）。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;import timer.Sound;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;このとき、「&lt;span style="font-family:lucida grande;"&gt;Sound&lt;/span&gt;」の下に赤い波線が表示され、「undefined type ...」のエラーアイコンが表示されますが、無視します（エラーメッセージが表示されますが、ちゃんとクラスファイルを認識しています）。&lt;br /&gt;そして、Timer.elapsedの置換triggerアクションの定義に続けて、次のTimer.runningの置換triggerアクションの定義を追加します。&lt;br /&gt;&lt;br /&gt;trigger on Timer.running = value {&lt;br /&gt;if (remainingTime &lt;= 0) {Sound.alarm();} }   &lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;br /&gt;これで、準備が整いました。最後に、アラーム時計&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;アプリケーションのプロジェクトを構築しなおして（このとき、「Clean and Build Project」を実行しないように注意します。せっかくコピーしたアラーム出力クラスファイルとサウンドファイルが消されてしまいます）、プロジェクトを実行します。&lt;/span&gt;&lt;br /&gt;アラーム時計のウィンドウが表示され、タイマに設定した時間（現在は１０秒固定）が経過すると、アラーム音が鳴り、メッセージウィンドウが表示されます。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_v58IVq86t4s/R1TvMEe4ZbI/AAAAAAAAAAM/ZeUDZMMahC0/s1600-R/%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%A0%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_v58IVq86t4s/R1TvMEe4ZbI/AAAAAAAAAAM/fwQNOr4TGHg/s320/%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%A0%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8.jpg" alt="" id="BLOGGER_PHOTO_ID_5139996065377314226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ここまでくれば、アラームタイマはほとんど完成したも同然です。あとは、タイマの時間を設定できるようにするだけですが、今日はここまで。いつものように、ソースコード全体を載せておきます。&lt;br /&gt;&lt;br /&gt;package timer;&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;import timer.Sound;&lt;br /&gt;&lt;br /&gt;public class Timer {&lt;br /&gt;private attribute elapsed: Number;&lt;br /&gt;public attribute seconds: Number;&lt;br /&gt;public attribute minutes: Integer;&lt;br /&gt;public attribute hours: Integer;&lt;br /&gt;public attribute count: Number;&lt;br /&gt;public attribute startTime: Number;&lt;br /&gt;public attribute elapsedTime: Number;&lt;br /&gt;public attribute remainingTime: Number;&lt;br /&gt;public attribute running: Boolean;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute Timer.elapsed = bind if running&lt;br /&gt;then [1..10] dur 1000 linear while running continue if running&lt;br /&gt;else 0;&lt;br /&gt;&lt;br /&gt;trigger on Timer.elapsed = value {&lt;br /&gt;var now = new Date();&lt;br /&gt;elapsedTime = now.getTime() / 1000 - startTime;&lt;br /&gt;remainingTime = count - elapsedTime;&lt;br /&gt;running = if (elapsedTime &gt;= count) then false else true;&lt;br /&gt;seconds = remainingTime % 60;&lt;br /&gt;minutes = ((Integer)remainingTime / 60) % 60;&lt;br /&gt;hours = ((Integer)remainingTime / 60) / 60;&lt;br /&gt;hours = if (elapsedTime &gt;= count) then 0 else hours;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trigger on Timer.running = value {&lt;br /&gt;if (remainingTime &lt;= 0) {Sound.alarm();}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var date = new Date();&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;var t = Timer {seconds:10, minutes:0, hours:0, count:10,&lt;br /&gt;startTime:(date.getTime() / 1000), running:true}&lt;br /&gt;title: "JavaFX アラーム"&lt;br /&gt;height: 225&lt;br /&gt;width: 215&lt;br /&gt;onClose: operation() {System.exit(0);}&lt;br /&gt;content:&lt;br /&gt;Canvas {&lt;br /&gt;content:&lt;br /&gt;Group {&lt;br /&gt;var font = new Font("Dialog", "PLAIN", 15)&lt;br /&gt;var secs = bind t.seconds&lt;br /&gt;var mins = bind t.minutes + secs / 60&lt;br /&gt;var hrs = bind t.hours + mins / 60&lt;br /&gt;content:&lt;br /&gt;[Rect {&lt;br /&gt; height: 225&lt;br /&gt; width: 225&lt;br /&gt; fill: white&lt;br /&gt;},&lt;br /&gt;Circle {cx: 100, cy: 100, radius: 80, fill: white, stroke: black, strokeWidth: 1},&lt;br /&gt;Group {&lt;br /&gt; transform: translate(100, 100)&lt;br /&gt; content: foreach (i in [1..12])&lt;br /&gt;   Text {&lt;br /&gt;     var radians = Math.toRadians(30 * i - 90)&lt;br /&gt;     transform: [translate((70 * Math.cos(radians)), (70 * Math.sin(radians)))]&lt;br /&gt;     content: "{i}"&lt;br /&gt;     valign: MIDDLE&lt;br /&gt;     halign: CENTER&lt;br /&gt;   }&lt;br /&gt;},&lt;br /&gt;Group {&lt;br /&gt; transform: translate(100, 100)&lt;br /&gt; var hourHand =&lt;br /&gt; Line {x1: 0, y1: 0, x2: 0, y2: -35,&lt;br /&gt;       strokeWidth: 4, stroke: black&lt;br /&gt;       transform: bind rotate((hrs * 30), 0, 0)&lt;br /&gt; }&lt;br /&gt;   var minuteHand =&lt;br /&gt;   Line {x1: 0, y1: 0, x2: 0, y2: -55,&lt;br /&gt;       strokeWidth: 2, stroke: blue,&lt;br /&gt;       transform: bind rotate((mins * 6), 0, 0)&lt;br /&gt;   }&lt;br /&gt;   var secondHand =&lt;br /&gt;   Line {x1: 0, y1: 0, x2: 0, y2: -75,&lt;br /&gt;       strokeWidth: 1, stroke: red,&lt;br /&gt;       transform: bind rotate((t.seconds * 6), 0, 0)&lt;br /&gt;   }&lt;br /&gt;   content: [hourHand, minuteHand, secondHand]&lt;br /&gt;},&lt;br /&gt;Circle {cx: 100, cy: 100, radius: 3, fill: black, stroke: black }]&lt;br /&gt;},&lt;br /&gt;}&lt;br /&gt;visible: true&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-16491345360159046?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/16491345360159046/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=16491345360159046' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/16491345360159046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/16491345360159046'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx3.html' title='JavaFXでアラーム時計を作る（3）'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_v58IVq86t4s/R1TvMEe4ZbI/AAAAAAAAAAM/fwQNOr4TGHg/s72-c/%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%A0%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-3397535803072529857</id><published>2007-12-03T10:50:00.000+09:00</published><updated>2007-12-03T13:19:41.693+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXでアラーム時計を作る（2）</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;せっかく、時計がカウントダウン表示されるようになったので、時間になったらアラーム音が鳴って、メッセージウィンドウが表示されるようにしてみます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;残念ながら、現状のJavaFX自体には、サウンド再生&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;の&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;サポートはありません（アニメーションと同期させてサウンドを再生するなどの応用を考えると、JavaFXでサウンドの再生やアニメーションとの同期などを簡潔に記述できるといいのですが…）。そこで、Javaのプログラムで音の再生とメッセージの表示を行うクラスを作成し、JavaFXのプログラムからそれを呼び出すことにしました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;NetBeansでJavaアプリケーションのプロジェクト（名前は任意）を作成し、パッケージ名を「timer」、ファイル名を「Sound.java」として、クラスファイルを作成します（&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;パッケージ&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;名は、作成済みのJavaFXファイルで指定した&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;パッケージ&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;名にあわせました。ファイル名は、その名前でJavaFXプログラムから参照しさえすれば、何でもかまいません）。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;サウンドの再生には、Java Appletなどで使うAudioClipクラスを利用します。ただ、Appletを作るわけではないので、java.applet.AppletクラスのクラスメソッドnewAudioClip()でサウンドファイルを読み込むようにします。このメソッドの引数には、サウンドファイルのURLを指定しないといけないのですが、それでは不便なので、作成するクラスの基底クラスclassからgetResource()メソッドを呼びだして、サウンドファイルのURLを取得し、引数に指定します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;AudioClipを生成したら、あとは、そのplay()メソッドを呼び出してサウンドをワンタイム再生するか、loop()メソッドとstop()メソッドで繰り返し再生とその停止を行うようにします。私は、メッセージウィンドウの表示に先立ってサウンドの繰り返し再生を起動し、メッセージウィンドウが閉じられたら再生を停止するようにしました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;サウンドファイルのタイプとしては、「.au」ファイルと「.wav」ファイルのどちらも指定できます。自分のパソコンから好きな音のファイルを捜してきて（ネットワークからダウンロードしてもいいのですが、得体の知れないものは怖いので）、そのファイルを、作成するクラスの「.class」ファイルが出力されるディレクトリ（プロジェクトファイルの下の「build\classes\〈パッケージ名〉\」ディレクトリ）にコピーします（このとき、ファイル検索ウィンドウ&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;からファイルを持ってくるときは、ファイルの移動を行わないように注意してください。不用意にドラッグするとファイルが移動され、元の場所からなくなってしまいます）。私は、「&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;TestMusic.wav&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;」という、ちょっと軽快な音楽が演奏されるファイルを選びました。&lt;br /&gt;メッセージウィンドウの表示には、おなじみのJOptionPane.showMessageDialog()を使用しました。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;（ＶＢのMsgboxに相当）は、ちょっとしたデバッグなどにも使えて便利なのですが、ダイアログウィンドウが必ずしもウィンドウスタックの最前面に表示されるわけではない、という難点（？）があります。この点については、同じように不便だと思われた方がいらしたようで、改造版を作られています。興味のある方は、Googleなどで検索してみてください。&lt;br /&gt;作成したプロジェクトを構築して実行すると、サウンドが再生されて、メッセージダイアログが表示されます。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;話が長くなってしまいましたので、今日はここまでです。&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;最後にソースを載せておきます（いつものように、インデントが消えてしまっています。ＨＴＭＬで編集すればいいのでしょうけれど…）。&lt;br /&gt;&lt;br /&gt;package timer;&lt;br /&gt;&lt;br /&gt;import java.applet.Applet;&lt;br /&gt;import java.applet.AudioClip;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;&lt;br /&gt;public class Sound {&lt;br /&gt;&lt;br /&gt;public static void alarm() {&lt;br /&gt;      AudioClip ac&lt;br /&gt;      = Applet.newAudioClip(Sound.class.getResource("TestMusic.wav"));&lt;br /&gt;//        ac.play();&lt;br /&gt;  ac.loop();&lt;br /&gt;  JOptionPane.showMessageDialog(null, "時間ですよ！", "警告！警告！", JOptionPane.WARNING_MESSAGE);&lt;br /&gt;  ac.stop();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;  Sound.alarm();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-3397535803072529857?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/3397535803072529857/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=3397535803072529857' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3397535803072529857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/3397535803072529857'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx2.html' title='JavaFXでアラーム時計を作る（2）'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-2839917632006808128</id><published>2007-12-02T12:13:00.000+09:00</published><updated>2007-12-07T14:12:57.491+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXでアラーム時計を作る</title><content type='html'>11月28日の投稿でアナログ時計のアプリケーションを紹介しましたが、それにちょっと手を入れて、アラームタイマを作ってみます。まずは、10秒固定でカウントダウン表示するようにしてみます。&lt;br /&gt;NetBeansで、適当な名前でJavaFXプロジェクトを作ります。今回は、package名を設定することにし、「timer」を指定しました。ファイル名も何でも良いのですが、「AlarmClock.fx」としました。&lt;br /&gt;まず、11月28日に投稿したコードをそのままコピーしてファイルに貼り付けます。&lt;br /&gt;次に、コードの先頭にpackage宣言&lt;br /&gt;&lt;br /&gt;package timer;&lt;br /&gt;&lt;br /&gt;を追加します。次に、Timerクラスのminutesとhoursの型をIntegerに変更します。&lt;br /&gt;&lt;br /&gt;public attribute minutes: Integer;&lt;br /&gt;public attribute hours: Integer;&lt;br /&gt;&lt;br /&gt;更に、Timerクラスに次の4つのattributeを追加します。&lt;br /&gt;&lt;br /&gt;public attribute count: Number;&lt;br /&gt;public attribute startTime: Number;&lt;br /&gt;public attribute elapsedTime: Number;&lt;br /&gt;public attribute remainingTime: Number;&lt;br /&gt;&lt;br /&gt;そして、Timer.elapsedの設定コードの「continue if true」の部分を「continue if running」と書き換えます。&lt;br /&gt;&lt;br /&gt;attribute Timer.elapsed = bind if running&lt;br /&gt;then [1..10] dur 1000 linear while running continue if running&lt;br /&gt;else 0;&lt;br /&gt;&lt;br /&gt;次に、Timer.elapsedの置換triggerアクションの定義を次のように変えます。&lt;br /&gt;&lt;br /&gt;trigger on Timer.elapsed = value {&lt;br /&gt;var now = new Date();&lt;br /&gt;elapsedTime = now.getTime() / 1000 - startTime;&lt;br /&gt;remainingTime = count - elapsedTime;&lt;br /&gt;running = if (elapsedTime &gt;= count) then false else true;&lt;br /&gt;seconds = remainingTime % 60;&lt;br /&gt;minutes = ((Integer)remainingTime / 60) % 60;&lt;br /&gt;hours = ((Integer)remainingTime / 60) / 60;&lt;br /&gt;hours = if (elapsedTime &gt;= count) then 0 else hours;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;そして、Frameインスタンスの定義の前に次の行を追加し、&lt;br /&gt;&lt;br /&gt;var date = new Date();&lt;br /&gt;&lt;br /&gt;Frameインスタンス内のTimerインスタンス生成コードを、次のように変更すれば完成です。&lt;br /&gt;&lt;br /&gt;var t = Timer {seconds:10, minutes:0, hours:0, count:10,&lt;br /&gt;    startTime:(date.getTime() / 1000), running:true}&lt;br /&gt;&lt;br /&gt;とりあえず、カウントダウンする10秒は、ハードコードしました。最後に全体のコードを載せておきます。&lt;br /&gt;&lt;br /&gt;package timer;&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;public class Timer {&lt;br /&gt;private attribute elapsed: Number;&lt;br /&gt;public attribute seconds: Number;&lt;br /&gt;public attribute minutes: Integer;&lt;br /&gt;public attribute hours: Integer;&lt;br /&gt;public attribute count: Number;&lt;br /&gt;public attribute startTime: Number;&lt;br /&gt;public attribute elapsedTime: Number;&lt;br /&gt;public attribute remainingTime: Number;&lt;br /&gt;public attribute running: Boolean;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute Timer.elapsed = bind if running&lt;br /&gt;then [1..10] dur 1000 linear while running continue if running&lt;br /&gt;else 0;&lt;br /&gt;&lt;br /&gt;trigger on Timer.elapsed = value {&lt;br /&gt;var now = new Date();&lt;br /&gt;elapsedTime = now.getTime() / 1000 - startTime;&lt;br /&gt;remainingTime = count - elapsedTime;&lt;br /&gt;running = if (elapsedTime &gt;= count) then false else true;&lt;br /&gt;seconds = remainingTime % 60;&lt;br /&gt;minutes = ((Integer)remainingTime / 60) % 60;&lt;br /&gt;hours = ((Integer)remainingTime / 60) / 60;&lt;br /&gt;hours = if (elapsedTime &gt;= count) then 0 else hours;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var date = new Date();&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;var t = Timer {seconds:10, minutes:0, hours:0, count:10,&lt;br /&gt;    startTime:(date.getTime() / 1000), running:true}&lt;br /&gt;title: "JavaFX アラーム"&lt;br /&gt;height: 225&lt;br /&gt;width: 215&lt;br /&gt;onClose: operation() {System.exit(0);}&lt;br /&gt;content:&lt;br /&gt;  Canvas {&lt;br /&gt;    content:&lt;br /&gt;    Group {&lt;br /&gt;      var font = new Font("Dialog", "PLAIN", 15)&lt;br /&gt;      var secs = bind t.seconds&lt;br /&gt;      var mins = bind t.minutes + secs / 60&lt;br /&gt;      var hrs = bind t.hours + mins / 60&lt;br /&gt;      content:&lt;br /&gt;      [Rect {&lt;br /&gt;        height: 225&lt;br /&gt;        width: 225&lt;br /&gt;        fill: white&lt;br /&gt;      },&lt;br /&gt;      Circle {cx: 100, cy: 100, radius: 80, fill: white, stroke: black, strokeWidth: 1},&lt;br /&gt;      Group {&lt;br /&gt;        transform: translate(100, 100)&lt;br /&gt;        content: foreach (i in [1..12])&lt;br /&gt;          Text {&lt;br /&gt;            var radians = Math.toRadians(30 * i - 90)&lt;br /&gt;            transform: [translate((70 * Math.cos(radians)), (70 * Math.sin(radians)))]&lt;br /&gt;            content: "{i}"&lt;br /&gt;            valign: MIDDLE&lt;br /&gt;            halign: CENTER&lt;br /&gt;          }&lt;br /&gt;      },&lt;br /&gt;      Group {&lt;br /&gt;        transform: translate(100, 100)&lt;br /&gt;        var hourHand =&lt;br /&gt;        Line {x1: 0, y1: 0, x2: 0, y2: -35,&lt;br /&gt;              strokeWidth: 4, stroke: black&lt;br /&gt;              transform: bind rotate((hrs * 30), 0, 0)&lt;br /&gt;        }&lt;br /&gt;          var minuteHand =&lt;br /&gt;          Line {x1: 0, y1: 0, x2: 0, y2: -55,&lt;br /&gt;              strokeWidth: 2, stroke: blue,&lt;br /&gt;              transform: bind rotate((mins * 6), 0, 0)&lt;br /&gt;          }&lt;br /&gt;          var secondHand =&lt;br /&gt;          Line {x1: 0, y1: 0, x2: 0, y2: -75,&lt;br /&gt;              strokeWidth: 1, stroke: red,&lt;br /&gt;              transform: bind rotate((t.seconds * 6), 0, 0)&lt;br /&gt;          }&lt;br /&gt;          content: [hourHand, minuteHand, secondHand]&lt;br /&gt;      },&lt;br /&gt;      Circle {cx: 100, cy: 100, radius: 3, fill: black, stroke: black }]&lt;br /&gt;    },&lt;br /&gt;  }&lt;br /&gt;  visible: true&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-2839917632006808128?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/2839917632006808128/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=2839917632006808128' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2839917632006808128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/2839917632006808128'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx_02.html' title='JavaFXでアラーム時計を作る'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4145529395462566395</id><published>2007-12-01T10:40:00.000+09:00</published><updated>2007-12-01T11:31:57.852+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>コマンドラインからのJavaFXインタプリタの起動</title><content type='html'>&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;（以下の例はWindowsの場合です。ほかのOS環境では読み替えてください）&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;コマンドラインからJavaFXインタプリタを起動するには、まず、PATH環境変数にOpenJFXをインストールしたディレクトリの下にある「trunk\bin」ディレクトリを設定します。例えば、OpenJFXをCドライブの下に「OpenJFX」という名前でインストールした場合は、「C:\OpenJFX\trunk\bin;」をPATH環境変数に追加します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;そして、コマンドプロンプトウィンドウを開いてJavaFXアプリケーションを保存したディレクトリに移動し、次のようにコマンドを入力します（「JfxApp.fx」アプリケーションを起動する場合の例）。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;&gt;javafx JfxApp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;もし、CLASSPATH環境変数を設定しているために「Exception in thread "main" java.lang.NoClassDefFoundError: ...」と、エラー表示されてアプリケーションを起動できないときは（私の場合がそうでした）、次のようにコマンドを入力して、CLASSPATHの値を空にしてから実行します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;&gt;set classpath=&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;&gt;javafx JfxApp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:webdings;" &gt;（「set classpath=」で、現在のコマンドプロンプトウィンドウのCLASSPATH の設定を解除します。ほかのコマンドプロンプトウィンドウのCLASSPATH設定には影響を与えません）。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4145529395462566395?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4145529395462566395/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4145529395462566395' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4145529395462566395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4145529395462566395'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/12/javafx.html' title='コマンドラインからのJavaFXインタプリタの起動'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-7125957852862442802</id><published>2007-11-28T18:31:00.000+09:00</published><updated>2007-11-28T19:04:53.724+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXで動的アプリケーションを作る</title><content type='html'>NetBeans上にJavaFXの開発環境をインストールしたので、JavaFXらしい動きのあるアプリケーションを作って動かしてみることにしました。&lt;br /&gt;と言っても、JavaFXPad用に書かれた&lt;a href="http://jfx.wikia.com/wiki/Clock_Example"&gt;時計のアプリケーション&lt;/a&gt;を、Frameウィンドウ上で動くように、ちょっと手を入れただけです（Javaと異なり、このような例ではファイル名として任意のものを指定できます）。変更したのは、次の2点です。&lt;br /&gt;1.TimerクラスのインスタンスをFrame内に直接生成する。&lt;br /&gt;2.Frameウィンドウを閉じたときにJVMが停止するように、onCloseオペレーションを追加する。&lt;br /&gt;秒針が滑らかに動くのを見ると、ちょっと感動ものです。参考までに、コードを載せておきます（適当にインデントを追加してください）。オリジナルと比べると変更箇所が分かります。&lt;br /&gt;&lt;br /&gt;import javafx.ui.*;&lt;br /&gt;import javafx.ui.canvas.*;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.lang.Math;&lt;br /&gt;import java.lang.System;&lt;br /&gt;&lt;br /&gt;public class Timer {&lt;br /&gt;private attribute elapsed: Number;&lt;br /&gt;public attribute minutes: Number;&lt;br /&gt;public attribute seconds: Number;&lt;br /&gt;public attribute hours: Number;&lt;br /&gt;public attribute running: Boolean;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;attribute Timer.elapsed = bind if running&lt;br /&gt;then [1..20] dur 1000 linear while running continue if true&lt;br /&gt;else 0;&lt;br /&gt;&lt;br /&gt;trigger on Timer.elapsed = value {&lt;br /&gt;var now = new Date();&lt;br /&gt;minutes = now.getMinutes();&lt;br /&gt;seconds = now.getSeconds() + (now.getTime() % 1000) / 1000;&lt;br /&gt;hours = now.getHours();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Frame {&lt;br /&gt;var t = Timer {running:true}&lt;br /&gt;onClose: operation() {System.exit(0);}&lt;br /&gt;title: "JavaFX 時計"&lt;br /&gt;height: 225&lt;br /&gt;width: 215&lt;br /&gt;content:&lt;br /&gt;  Canvas {&lt;br /&gt;    content:&lt;br /&gt;    Group {&lt;br /&gt;      var font = new Font("Dialog", "PLAIN", 15)&lt;br /&gt;      var secs = bind t.seconds&lt;br /&gt;      var mins = bind t.minutes + secs / 60&lt;br /&gt;      var hrs = bind t.hours + mins / 60&lt;br /&gt;      content:&lt;br /&gt;      [Rect {&lt;br /&gt;        height: 225&lt;br /&gt;        width: 225&lt;br /&gt;        fill: white&lt;br /&gt;      },&lt;br /&gt;      Circle {cx: 100, cy: 100, radius: 80, fill: white, stroke: black, strokeWidth: 1},&lt;br /&gt;      Group {&lt;br /&gt;        transform: translate(100, 100)&lt;br /&gt;        content: foreach (i in [1..12])&lt;br /&gt;          Text {&lt;br /&gt;            var radians = Math.toRadians(30 * i - 90)&lt;br /&gt;            transform: [translate((70 * Math.cos(radians)), (70 * Math.sin(radians)))]&lt;br /&gt;            content: "{i}"&lt;br /&gt;            valign: MIDDLE&lt;br /&gt;            halign: CENTER&lt;br /&gt;          }&lt;br /&gt;      },&lt;br /&gt;      Group {&lt;br /&gt;        transform: translate(100, 100)&lt;br /&gt;        var hourHand =&lt;br /&gt;        Line {x1: 0, y1: 0, x2: 0, y2: -35,&lt;br /&gt;              strokeWidth: 4, stroke: black&lt;br /&gt;              transform: bind rotate((hrs * 30), 0, 0)&lt;br /&gt;        }&lt;br /&gt;          var minuteHand =&lt;br /&gt;          Line {x1: 0, y1: 0, x2: 0, y2: -55,&lt;br /&gt;              strokeWidth: 2, stroke: blue,&lt;br /&gt;              transform: bind rotate((mins * 6), 0, 0)&lt;br /&gt;          }&lt;br /&gt;          var secondHand =&lt;br /&gt;          Line {x1: 0, y1: 0, x2: 0, y2: -75,&lt;br /&gt;              strokeWidth: 1, stroke: red,&lt;br /&gt;              transform: bind rotate((t.seconds * 6), 0, 0)&lt;br /&gt;          }&lt;br /&gt;          content: [hourHand, minuteHand, secondHand]&lt;br /&gt;      },&lt;br /&gt;      Circle {cx: 100, cy: 100, radius: 3, fill: black, stroke: black }]&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  visible: true&lt;br /&gt;}&lt;br /&gt;&lt;span class="wikiwyg_section" id="wikiwyg_section_1"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-7125957852862442802?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/7125957852862442802/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=7125957852862442802' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7125957852862442802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7125957852862442802'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/11/javafx_28.html' title='JavaFXで動的アプリケーションを作る'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-7949565480794377902</id><published>2007-11-27T16:13:00.000+09:00</published><updated>2007-11-27T16:47:26.390+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXコンパイラが実用になると構文が変わる</title><content type='html'>現在のJavaFXファイルの実行はインタプリタ方式ですが、JavaFXコンパイラの開発が鋭意勧められています。&lt;br /&gt;コンパイラが実用になると、それに伴ってJavaFXの構文も多少変わるようです。まだ検討中のものあるようでその全貌は分かりませんが、少なくとも私には、よりシンプルな記述が可能になる方向に変わろうとしているように思えます。&lt;br /&gt;どのように変わろうとしているのか興味がおありの方は、&lt;a href="http://jfx.wikia.com/wiki/OpenJFX_Compiler"&gt;Planet JFXのページ&lt;/a&gt;、&lt;a href="http://learnjavafx.typepad.com/weblog/compiled_javafx_script/index.html"&gt;Weaverさんのブログ&lt;/a&gt;をご覧ください。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-7949565480794377902?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/7949565480794377902/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=7949565480794377902' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7949565480794377902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7949565480794377902'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/11/javafx_27.html' title='JavaFXコンパイラが実用になると構文が変わる'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-4558230531534901754</id><published>2007-11-26T14:42:00.000+09:00</published><updated>2007-11-26T16:34:30.800+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>NetBeansへのJavaFX開発環境のインストール</title><content type='html'>「次回は・・・」と言いながら、1回間があいてしまいました。しかも、今回はその内のIDE（NetBeans）へのJavaFX開発環境のインストールの分だけです（もう予告するのは止めにしよう）。&lt;br /&gt;JavaFXPadは、いかがだったでしょうか。日本語も、特に何の設定もすることなく表示できたことと思います。ただし、JavaFXPadを起動したときに表示される「JavaFX」の文字ように、フォントとして日本語の字体を含まないもの（この例では「faceName: 'Verdana'」）を設定していると、日本語の文字が四角い枠で表示されてしまいます。その場合は、日本語の字体を含むフォントを指定する（たとえば「faceName: 'Sans-Selif'」と記述する）か、フォントまたはフォント名の指定そのもの（この例では「faceName: 'Verdana',」の部分）を削除してしまえば、日本語が表示されます。&lt;br /&gt;JavaFXの構文を学習したら、&lt;a href="https://openjfx.dev.java.net/ja/"&gt;OpenJFXホームページ&lt;/a&gt;に紹介されている&lt;a href="http://download.java.net/general/openjfx/demos/tutorial.jnlp"&gt;JavaFX Script 2D Graphics Tutorial&lt;/a&gt;にアクセスして、2Dグラフィックスのチュートリアルをダウンロードして調べてみると面白いです。図形のアフィン変換も簡単に指定できるので、durオペレータと組み合わせると、ちょっとした動的アプリケーションならすぐに作れます。ちなみにdurオペレータの構文については、&lt;a href="http://d.hatena.ne.jp/Syunpei/20070712/1184219120"&gt;白石さんの日記&lt;/a&gt;に詳しく説明されていています。&lt;br /&gt;前説が長くなりましたが、IDEへのJavaFX開発環境のインストールについては、OpenJFXホームページの「ダウンロード」に、手順を記したページへのリンクが載っています。ちなみに、私は&lt;a href="https://openjfx.dev.java.net/javafx-nb55-plugin-install.html"&gt;NetBeans IDE 5.5 用 JavaFX Script プラグイン: ダウンロードとインストレーション手順&lt;/a&gt;に従って、NetBeans 5.5へプラグインをインストールして使っています（プラットフォームは、Windows XP SP2、JDK 1.5.0_11です）。&lt;br /&gt;NetBeansでのJavaFXプログラムの作成と実行方法については、OpenJFXホームページに載っている&lt;a href="https://openjfx.dev.java.net/ja/Getting_Started_With_JavaFX.html"&gt;JavaFX Script 言語 はじめの一歩&lt;/a&gt;が参考になります。GUIコンポーネントの使い方については、&lt;a href="https://openjfx.dev.java.net/ja/Learning_More_About_JavaFX.html"&gt;深く学ぼう JavaFX Script 言語&lt;/a&gt;にひととおり紹介されています。今まで敬遠していたレイアウトマネジャも、比較的容易に利用できるのがうれしいです（これから主流になるであろう携帯端末上で動作するアプリケーションを構築することを考えると、レイアウトマネジャの利用は必須だと思っていますので）。&lt;br /&gt;また、クライアント／サーバアプリケーションの簡単な例については、&lt;a href="http://java.sun.com/developer/technicalArticles/scripting/javafxpart3/"&gt;Learning JavaFX Script, Part 3: Client-Server Communication With JAX-WS&lt;/a&gt;が参考になります（人の褌で相撲を取っているので、「参考になります」ばかり）。&lt;br /&gt;&lt;a href="http://download.java.net/general/openjfx/demos/tutorial.jnlp"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-4558230531534901754?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/4558230531534901754/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=4558230531534901754' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4558230531534901754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/4558230531534901754'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/11/netbeansjavafx.html' title='NetBeansへのJavaFX開発環境のインストール'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-1071480386425139221</id><published>2007-11-25T11:32:00.000+09:00</published><updated>2007-11-25T11:55:41.779+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXのコンパイラがより簡単に入手可能</title><content type='html'>これまでは、ソースコードを入手して自分で構築しないと使えなかったJavaFXコンパイラですが、構築済みのものをダウンロードして使えるようになったようです（&lt;a href="http://learnjavafx.typepad.com/"&gt;Jim Weaverさんのブログ&lt;/a&gt;、&lt;a href="http://jfx.wikia.com/wiki/How_to_Download_the_Latest_Compiler_Build_Instead_of_Building_It"&gt;Planet JFXのページ&lt;/a&gt;を参照してください）。&lt;br /&gt;私自身は、まだ試していません。すぐに利用できるようになるという、次の省スペース版が出たら試してみようかと思っています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-1071480386425139221?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/1071480386425139221/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=1071480386425139221' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1071480386425139221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/1071480386425139221'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/11/javafx_25.html' title='JavaFXのコンパイラがより簡単に入手可能'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1668751503451793669.post-7488938830240066567</id><published>2007-11-24T14:41:00.001+09:00</published><updated>2007-11-24T18:25:53.920+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><title type='text'>JavaFXことはじめ</title><content type='html'>最近（といっても11月に入ってからですが）、JavaFXについて調べています。&lt;br /&gt;JavaFX言語の開発実行環境は、手軽に利用できるものが用意されているので、それをダウンロードして、最新のプログラミング言語（いわゆるRIAというもの）を試してみることにしました。Javaの知識が多少なりともあるため取っつきやすく、表現力豊かなデスクトップアプリケーションが簡単に作成できるので、ちょっと楽しくなりました。&lt;br /&gt;まずは、SunのJavaFX紹介&lt;a href="http://sdc.sun.co.jp/java/series/javafx/private/200707.html"&gt;ページ&lt;/a&gt;にアクセスして、JavaFX Scriptを入手しました。このページで紹介されているのは、JavaFXの２Dグラフィックスのチュートリアルでした。最初は、JavaFX言語の構文が分からずたいしたことはできませんでしたが、それでも、モーフィングのデモは期待にたがわないものであることを予感させてくれました。&lt;br /&gt;次に、紹介ページに記載されているOpenJFXプロジェクトの&lt;a href="https://openjfx.dev.java.net/ja/"&gt;ページ&lt;/a&gt;にアクセスし、「デモ」の中から&lt;a href="http://download.java.net/general/openjfx/demos/javafxpad.jnlp"&gt; JavaFX Script  JavaFXPad Demo&lt;/a&gt;をクリックして、JavaFXPadを入手しました。JavaFXPadを利用すると、コーディングするそばからプログラミングの結果が見られるので、ちょっとJavaFXを試してみるという用途には最適です。JavaFXPadを使って、OpenJFXプロジェクトのページに載っている&lt;a href="https://openjfx.dev.java.net/ja/JavaFX_Programming_Language.html"&gt;JavaFX Script プログラミング言語 リファレンス&lt;/a&gt;や、稚内北星学園大学の&lt;a href="http://www.wakhok.ac.jp/%7Etatsuo/jfx2007/"&gt;JavaFX 2007&lt;/a&gt;などでJavaFX言語の基礎を習得することにしました（私はこの順番で読んだのですが、最初にJavaFX 2007の方を読んだ方が分かりやすかったかなと、思います）。&lt;br /&gt;OpenJFXプロジェクトのページには、このほかにもいろいろと情報が載っており、それらのリンク（wiki、メーリングリスト、ブログなど）をたどるとリアルタイムで新しい言語の誕生に触れることができるので、毎日わくわくしながら読んでいます。&lt;br /&gt;次回は、IDE（NetBeans）上への開発環境の構築と、コマンドラインからのJavaFXインタプリタ起動についてお話したいと思っています。&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1668751503451793669-7488938830240066567?l=terrasweblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrasweblog.blogspot.com/feeds/7488938830240066567/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1668751503451793669&amp;postID=7488938830240066567' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7488938830240066567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1668751503451793669/posts/default/7488938830240066567'/><link rel='alternate' type='text/html' href='http://terrasweblog.blogspot.com/2007/11/javafx.html' title='JavaFXことはじめ'/><author><name>terra</name><uri>http://www.blogger.com/profile/10462520408905602659</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
