約 5,738,761 件
https://w.atwiki.jp/slashdrop/pages/16.html
CrossFire 猫耳幼女帝國 -ShDp-
https://w.atwiki.jp/osusume-eroge/pages/56.html
CROSS † CHANNEL メーカー FlyingShine ジャンル ADV・ノベル 作品傾向 学園もの 主人公・男キャラ 備考 シナリオ:田中ロミオ 原画:松竜 名前 コメント
https://w.atwiki.jp/anews/pages/205.html
2009年予定 過去90日間に書かれた、ROBO CROSSERを含む全ての言語のブログ記事 このグラフをブログに貼ろう! ブログ #blogsearch2 ニュース2 gnewプラグインエラー「ROBO CROSSER」は見つからないか、接続エラーです。
https://w.atwiki.jp/kairakunoza/pages/600.html
━━ Cross 「なぁ、こなた 醤油はこんなもんか?」 「ん~、も~ちょっと多い方がいいかも」 つかさです…… 私は今、こなちゃん家の居間にいます…… キッチンではこなちゃんとおじさんが夕食の準備をしています…… なんでこんなことになってしまったかというと……… それは、1時間程前にさかのぼるとです……… (ぁう~、家の前まで来ると緊張するよ~………) 決意してここまで来たはずなのに インターホンを押す手がなかなかボタンまで伸びてくれない そうこうしていると……… 「あれ~? つかさ、なにしてんの?」 「はわっ! こ、こなちゃん!?」 何故かこなちゃんは後ろからやってきました 「こ、こなちゃん ど、どうしてここに!?」 「どうしてって、ここ私の家だし」 「はわわっ そ、そうだよね」 「つかさこそ、どうしてここに?」 「はわっ その、近くまで来たから……」 「じゃあ、ちょっと寄っていきなよ」 「は、はぅう~……」 こうして、なし崩し的にこなちゃんの家で夕飯をご馳走になることになったのです…… 「ところで、つかさってマ○チだったっけ? てっきり神○だと思ってたけど?」 こなちゃんのこの言葉の意味は結局最後まで分かんなかったけど……… (あ、そうだ………) ここまでくると断るのも失礼なので、家に連絡を入れておかないと 私は携帯を取りだして、メールを打つ (お姉ちゃん、もう家にいるよね) お姉ちゃんの携帯に夕飯をご馳走になるので帰りが遅くなる旨のメールを送信する ♪~ あ、メールが帰ってきた 開いたメールには、あんまり遅くならないようにとか迷惑かけるんじゃないとかお決まりの言葉が散りばめられていた 最後の一文を除いては 『こなたやみゆきのこと、泣かせたら承知しないからね』 うん、大丈夫だよ なんか、そんな気がしたんだ たとえ結果がどうなっても……… 「「「ごちそうさまでした~」」」 「どうだった? つかさ?」 「うんっ、とっても美味しかったよ」 「こんなので良かったら、また食べに来てくれな」 「ちょ、おとーさーん」 「ははっ、冗談だよ」 「(=ω=.)」 冗談でもこんなことを言い合えるのを見ると、本当にこの二人な仲が良いんだと思った その後、おじさんは仕事があるからと言って部屋に行ってしまった 「まだ時間大丈夫でしょ? 私の部屋でゲームでもしてかない?」 「うん じゃあ、もうちょっとだけ……」 これは、チャンス……なのかな? それからしばらく、こなちゃんの部屋でゲームをしたり漫画を読んだり ゲームで対戦したりしたけど、やっぱりこなちゃんは強いね そして、1時間くらい過ぎた頃 「ちょっと、外に出ない?」 想いを伝えるため、こなちゃんを外に誘った……… 夜の空気は昼間のそれとは少しだけ冷たくて、少しだけ心地よく感じた 「今年は花火とかやってないねー」 「んー、まだ夏休みは長いんだし、みんなでやろうよ かがみやみゆきさんとかゆーちゃん達も誘って」 「うんっ、そうだね」 「あ、でも夏コミ前は勘弁な 絶対ひよりんとかヒヨってるから」 「あはは、分かったよ」 他愛もない世間話を交わす やっぱり、本人を前にすると緊張するなぁ 「つかささぁ………」 「うん、なぁに?」 「何か話があるから外に出たんじゃない? つかさから誘われるの珍しいからさ………」 ありゃ、こなちゃんはお見通しか もう覚悟を決めるしかないみたいだね 「私、こなちゃんのこと、好きなんだ……」 「私だって、つかさのこと好きだよ」 「そうじゃないの 友達としてじゃなくて、恋人として………好きなの」 「つかさ………」 「初めて会った時、こなちゃんに助けてもらった時に、きっと一目で好きになっちゃったんだ」 もちろん、初めは友達としての感情もあったと思う それが先日の夏祭りの一件で外に出てきた それだけのことだと思う 「ひとつ、聞きたいんだけど……」 黙って話を聞いてくれてたこなちゃんが、やっと口を開いてくれた 「つかさは、私のどこが好きなの? 私ってば、ヲタで面倒くさがりであんまり萌え要素とかないと思うんだけど……」 急に言われたので、キョトンとしてしまう私 でも、聞かれたからには答えなきゃ…… 「そうだねー、一緒にいると楽しいからかなぁ」 「でも、それは友達としてでもいいんじゃい?」 「うん でも、私はこなちゃんといるから楽しいんだよ」 「私と………いるから?」 「もちろん、お姉ちゃんやゆきちゃんといるときも楽しいけど やっぱり、私はこなちゃんがいいんだ」 う~ん、我ながら答えになってないかも……… でも、これ以上説明しようがないし……… 「あっはは そっか、つかさは私がストライクゾーンなのかぁ」 「?????」 突然こなちゃんがおかしなことを言い出した そんなに変なことは言ってないつもり、なんだけど……… 「ごめんごめん いや、あまりにも面白くって」 「あ~、こなちゃんひどいよ~」 「いゃあ、つかさにこんなこと言われると、悩んでた自分が馬鹿みたいだなぁって」 えっ? それって、どうゆう……… 「私もつかさのこと好きだよ、もちろん恋人として」 「こなちゃん………」 「だからさ、ひとつお願いがあるんだ」 「お願い?」 「私こんな雰囲気だと何言ってぶち壊すか分かんないから、私の口を塞いじゃってよ」 口を、塞ぐ? そ、そそそそれって き、き、き、キスってこと~!!?? 「まさに、リアル『それなんてエロゲ?』」 「こ、こなちゃん 何か言った?」 「いやぁ、つかささんは可愛いなぁって」 絶対にからかわれてる でも、好きになっちゃったんだからしょうがないか……… 「…………………」 「…………………」 「こなちゃん……」 「なに?(=ω=.)」 「その、してくれないの?」 「だって、つかさの方が背が高いし、背伸びとかするの面倒くさ~い」 う~、こなちゃんの意地悪 私はこなちゃんの肩に手を置いて、その、キスを……… 「はじめてだから、優しくしてね」 「うん、私もはじめてだけど、がんばるね」 「つかさ~、そこは『それなんてエロゲ?』って突っ込まなきゃ」 「あ、ごめん……」 「ほらほら、早くしないとムードが完全にぶち壊れちゃうよ」 しょうがないなぁ でも、これもこなちゃん 全部まとめて、こなちゃんのことが好きなんだ だから私は勇気を振り絞って こなちゃんの唇に私の唇を重ねたんだ Memoriesへ続く コメントフォーム 名前 コメント
https://w.atwiki.jp/keroro00innovator/pages/5264.html
Buster Bros!!! VS 麻天狼 VS Fling Posse Buster Bros!!! VS 麻天狼 VS Fling Posse アーティスト Buster Bros!!!・麻天狼・Fling Posse 発売日 2021年9月8日 レーベル キングレコード デイリー最高順位 1位(2021年9月8日) 週間最高順位 1位(2021年9月14日) 月間最高順位 1位(2021年9月) 年間最高順位 5位(2021年) 初動売上 63479 累計売上 78035 アニソンオリコン1位獲得作品 ゴールド 週間1位 月間1位 下半期1位 キャラ名義下半期1位 収録内容 曲名 タイアップ 視聴 1 SHOWDOWN ヒプノシスマイク キャラソン 2 Hoodstar+ 3 2nd D.R.B NON-STOP DIVISION MIX ランキング 週 月日 順位 変動 週/月間枚数 累計枚数 1 9/14 1 新 63479 63479 2 9/21 2 ↓ 7483 70962 3 9/28 7 ↓ 4373 75335 4 10/5 5 1889 77224 2021年9月 1 新 77224 77224 5 10/12 7 ↓ 408 77632 6 10/19 ↓ 229 77861 7 10/26 ↓ 174 78035 配信ランキング Hoodstar+ 週 月日 デジタルシングル 総合シングル 順位 週/月間DL数 累計DL数 順位 週/月間枚数 累計枚数 1 9/7 4 3625 3625 8 1450 1450 関連CD どついたれ本舗 VS Buster Bros!!! Bad Ass Temple VS 麻天狼 Fling Posse VS MAD TRIGGER CREW
https://w.atwiki.jp/2ch_aa_rpg/pages/107.html
【作品名】Cross over 【作者】◆BmF0VLGyWg 本スレpart50 872 【配布先】モナーRPG製作委員会にて保管中 http //monarpg.usamimi.info/ 【使用ツール】RPGツクール2000 ■作品解説 2ちゃんモナーRPGスレがpart50に至ったのを記念して製作された見るゲー。 複数の作者の独自キャラクターが夢の競演を果たすという試みが このスレでは恐らくはじめて実行され、2007年度見るゲー部門MVP投票1位・総合2位タイにも輝いている。 ■ストーリー ツクスレという名の巨大な空間には複数の世界が存在しており、 それぞれは位相の壁によって隔てられていた。だが…!? ■主要キャラクター 見てのお楽しみ 最近クロスオーバーリレーというリレーがスタートしたが、 このクロスオーバーとはまた別の話。 -- 名無しぃ (2009-04-23 13 35 10) この時点では論外さん、豚斬男さん、 魔争さん、エノハさん、セレネさんの キャラたちだけだったね。 -- 名無しさん (2019-05-02 08 56 05) 名前 コメント
https://w.atwiki.jp/i_ro/pages/238.html
This page has been marked as being in need of links (Item/Monster/Map) to a Database. 必要条件 Base Lv 99 Job Lv 50 (取り損ねた Skill Point は後からどうやっても増やす事が出来ない為、70にしておく事を強く勧める) 職業 Assassin または Assassin Cross アイテム Reset Stone 1個 (Non-VIP の場合のみ) 報酬 アイテム Jewelry Box 1個, Silent Executer 1個, Green Apple Ring 1個 クエスト報酬 Guillotine Cross への転職 TIP (*4)Base レベルが99になっていても Job レベルが最大 (Assassin Cross だと70) になっていない場合は このクエスト中に発生する強制的な待ち時間 (1時間と30分間) の間に他のクエストを進める事も出来る この方法で待ち時間をレベル上げに有効活用すると、現実の生活時間の節約が可能だ 単純にクエストをずっと進めたいだけなら Job レベルを最大にしておく事だ 1. Morroc× の 酒場 (morroc 45, 107) へ行く The Morroc Pub - iRO wiki の画像表示 2. Guild Member と話す (VIP 契約していないプレイヤーはここで Reset Stone が1個必要になる(*5)(*6)) Guild Member - iRO wiki の画像表示 3. Veins× にある Guillotine Cross Assassin Guild 本部 ( veins 254, 255) を訪ねる(*7) Veins Assassin Guild - iRO wiki の画像表示 4. Guild 本部の中にいる Daora と話す(*8) Daora - iRO wiki の画像表示 5. 部屋の右下のポータルを通って次の部屋の左にあるポータルへ入る(*9) 6. Mayshell と話す Mayshell - iRO wiki の画像表示 7. Guild 本部の最初の部屋へ戻って再び Daora と話す 選択肢 に "Ask for help." が出るまで飲み物を注文し続ける (選択肢で選ぶのは "..." )(*10) 訳注 : 以下ステップ8~10をこなす順番はどれからでもいい模様(*11) 8. Vigilante (veins 291, 214) と話す(*12) Vigilante - iRO wiki の画像表示 9. 道具屋 (veins 230, 162) に入って Young Merchant と話す(*13) [veins 230, 162] Young Merchant - iRO wiki の画像表示 10. 酒場(*14)(veins 148, 216) に入って Waitress Madelle(*15)と話す(*16) Trovan の話の疑問点についての選択肢では Their residence is unknown(*17)を選ぶ(*18) [veins 148, 216] Waitress Madelle - iRO wiki の画像表示 11. Peddler (veins 184, 142) と話す(*19) The Peddler - iRO wiki の画像表示 12. Old Man (veins 231, 125) と話す The Old Man - iRO wiki の画像表示 13. Girl (veins 226, 180)(*20)と話す。選択肢ではそれぞれ次の答えを選ぶ : Girl ・ yellowish hair ・ young(*21)(*22) The Girl - iRO wiki の画像表示 14. Guild 本部へ戻って Daora と話す。1回注文する(*23)と彼女は街の袋小路の事について話し出す 15. クエストウィンドウで指定された時間 (ステップ13の会話から10分後(*24)) に (veins 341, 286) の辺りへ行って 自動会話が始まり NPC が現れるまでその近くを歩き回る You have the chance to fail at catching her; you will have to wait another 5 minutes to try again if this happens. (Approaching from below while cloaked may have a higher success rate. Do not uncloak during the dialogue - it will end and this will register as a failure.) あなたには、彼女を捕らえるのを失敗する機会があります。 これが起こると、あなたは、もう5分間再試行するのを待たなければならないでしょう。 (着ていられる間、下からアプローチするのにおいて、より高い成功率があるかもしれません。 対話の間、外套を脱がないでください--終わって、これが失敗として登録される、) プレイヤーキャラは彼女を捕まえ損ねる場合があり、取り逃がすと再挑戦までに5分(*1)待たされるハメになる (まともに捕まえる為には、スキル Cloaking で隠れながら下から近付くと成功率が高い ダイアログが出ている間に Cloaking を解くと会話が終わった後に失敗判定されてしまうので、ずっと隠れながら進める事) ・・・? Veins NPC Trigger - iRO wiki の画像表示 16. Daora の所へ戻って他の話を聞く為に飲み物を注文する(*25) 17. 右のポータルに入った先の廊下で更に右のポータルに入り、次の部屋の机の後ろにいる NPC (Estillda) と話す Estillda - iRO wiki の画像表示(*26) 18. クエストウィンドウで指定された時間 (ステップ17の会話から30分後)(*27)(*28)に (veins 206, 55) へ行くと自動会話が始まる [veins 206, 55] - iRO wiki の画像表示 19. NPC が1人いる部屋に転送され、そいつと話すと攻撃を受ける それを倒して死体をクリックすると鍵が手に入り、更に死体をクリックすると転送されて Veins へ戻る NOTE The NPC monster has a lot of HP but seems to have low hit and doesn't hit for much damage. Just keep attacking and he will eventually die with little fuss. Also if you happen to disconnect within the room at any point in time, don't panic. You won't have to wait another 30 minutes to fight him again. Just spam the pop-up window at the entrance of the building till it lets you enter once again. NPC怪物は、多くのHPを持ちますが、安値を打たせるように思えて、多くのために損害を打ちません。 ただ攻撃し続けてください。そうすれば、彼は、結局、大騒ぎでほとんど死なないでしょう。 また、時間内に任意な点の部屋の中でたまたま連絡を断つなら、慌てないでください。 あなたは、もう30分間再び彼と戦うのを待つ必要はないでしょう。 ビルの入り口にそれがもう一度入らせることができるまでただポップアップウィンドウをばらまいてください。 NPC モンスターは HP だけは多いが、攻撃は空振りが多く、もし当たっても大したダメージはない 普通に攻撃を続けていればちょっとギャーギャー騒ぎつつ勝手に死んでしまう このステップ中にサーバーとの接続が切れても、また戦うまでに30分待たされる、という事は無いので慌てる必要は無い 建物の入り口で自動会話が始まればもう1度入り直せる ・・・? また、職が Assassin Cross だったら戦闘をより速やかに済ませる為に Enchant Deadly Poison の使用を勧めるこれはステップ27でも同様なので、どちらでもそれを使うつもりなら Poison Bottle を何個か持って行く事 NPC Inside Room 1st NPC Battle Mansion Key Pickup - iRO wiki の画像表示 20.(*29)(*30)Rachel× へ行って Girke ( rachel 115, 76) と話す Girke - iRO wiki の画像表示 21. 建物 (rachel 61, 37) に入って Oresa Rava と話す Building in Rachel - iRO wiki の画像表示 22. Veins の Guild 本部へ戻って Mayshell の所に行く NOTE 次のステップで会いに行く GX NPC の居場所は変動し、下記 (ステップ23,24) の2ヶ所が確認されているどちらへ行く事になるかは Mayshell との会話後にクエストウィンドウで指定されるので、確認してその場所へ行く事 23. 居場所1 Veins Field 5 へ行って女 ( ve_fild05 328, 308)(*31)と話すと新たなマップへ転送されそこでの課題をクリアする制限時間として10分与えられる(*32) Veins Field 5 Girl - iRO wiki の画像表示 24. 居場所2 Veins Field 2 へ行って女 ( ve_fild02 330, 384)(*33)と話すと新たなマップへ転送されそこでの課題をクリアする制限時間として10分与えられる(*34) Veins Field 2 Girl South Rachel Veins Field 2 Girl South Rachel_2 - iRO wiki の画像表示 25.(*35)フェンスの先端辺りにある隙間(*36)を見付けて通り抜け (隙間の位置は地面の影を見ると判る.隙間をクリックして 選択肢で crawl through(*2)を選ぶ.その際、隙間のすぐ隣にいないとダイアログは表示されない(*3))、Cloaking× を使って Guard 達に見付からないように建物の裏へ回り込む 但し Guard Dog は Demon× 種族になっており Cloaking を見破られてしまうので注意して歩く事(*37) Mansion Fence [Crawl Space] Inside Mansion with Guards and Guard Dogs - iRO wiki の画像表示 26. 裏手のドアに入る(*38) Backdoor - iRO wiki の画像表示 27. 建物内にいる NPC と話す。会話が終わると NPC は襲い掛かって来る NOTE 敵 NPC は HP が多く、この戦闘中もマップ内を Guard Dog がうろつき回っているので用心する事Guard Dog の邪魔が入らないように敵 NPC を何もいないスペースへ引っ張っていくのがいいだろう敵 NPC からは一撃で1000以上の HP ダメージを食らわされるので、回復量の多い回復剤を用意しておこうまた、敵 NPC は Large size で種族は Demon、属性は Undead× に設定されている Priest from Rachel Aggro Priest Defeated Priest Pope Cookie D - iRO wiki の画像表示 28. 敵 NPC を倒したら裏手のドアから外に出て、右の方(*39)にいる NPC(*40)と話すと Veins の Guild 本部へ転送で戻される NOTE もし制限時間の10分を超えていた場合は転送前 (ステップ23,24) の場所へ戻され、成功するまでやり直しになる途中で殺された場合も同様に戻されるが、その回の制限時間が満了するまで再入場は出来ないGX NPC と話した時に "襲撃するにはもっと暗くなってからがいい" 等と薀蓄を垂れる場合は、まだ前の10分が残ったままである事を意味している(*41)また他の転職試験の実戦テスト同様1回に1人しか出来ない為、先客がいた場合の待ち時間も存在する他のプレイヤーは前のプレイヤーのテストが終了して女性 GX NPC が入場許可するまで待っていなければならない Exit Mansion - iRO wiki の画像表示 29. 部屋に入って北にいる Mayshell と話す 30. You will be given a grade by Mayshell based on how well you accomplished your quests (i.e. How many times did you have to ask about what to do or how many times did you question Daora, and how many times you died during NPC battles). Grades range from A-F and are essentially cosmetic. Any grade lower than a C will not receive a Jewelry Box award. Mayshellによるグレードをあなたに与えるでしょう。 あなたが探索をどれくらいよく実行したかに基づいています。 すなわち(。 あなたは、何回、するべきことに関して尋ねなければなりませんでしたか? または、あなたは、何回かDaoraに質問しました。 そして、あなたが何回NPCの間、死んだか戦われる、) グレードは、A-Fから変化して、本質的には化粧品です。 C意志より低どんなグレードもJewelry Box賞を受けません。 クエストの成績 (つまり課題についての質問回数 ・ Daora に対する質問回数 ・ 敵 NPC との戦闘で負けた回数) によって Mayshell からランク判定を受ける(*42) ランクは表面的な評価として A ~ F の6段階に分かれており、C より低い場合は転職特典の Jewelry Box がもらえない ・・・?(*43) Debriefing Mayshell Grading Jewelry Box Reward - iRO wiki の画像表示 31. Mayshell のいる部屋を出て右の部屋へ入り、Bercasell と話して Guillotine Cross になりたいと伝える(*44)と Guillotine Cross という職についての話を聞かされた後、転職出来る Bercasell GX Job Change - iRO wiki の画像表示 (訳注 : 15/12/05 の時点で、Non-VIP だと Reset Stone を所持した状態で最初の会話をした後、一旦キャンセルしてから Reset Stone を所持せずに話を進めた場合でも試験をクリアすれば転職出来た (Classic Server の2次転職のように最初に使わなくても最後に改めて要求されるという事が無かった) 多分不具合) - Assassin ・ Assassin Cross ・ Guillotine Cross Assassin ・ Assassin Cross ・ Guillotine Cross 2nd ClassSkills Cloaking× ・ Enchant Poison× ・ Grimtooth× ・ Katar Mastery× ・ Lefthand Mastery× ・ Righthand Mastery× ・ Poison React× ・ Sonic Acceleration× ・ Sonic Blow× ・ Venom Dust× ・ Venom Knife× ・ Venom Splasher× TranscendentSkills Advanced Katar Mastery× ・ Create Deadly Poison× ・ Enchant Deadly Poison× ・ Hallucination Walk× ・ Meteor Assault× ・ Soul Destroyer× 3rd ClassSkills Antidote× ・ Cloaking Exceed× ・ Counter Slash× ・ Cross Impact× ・ Cross Ripper Slasher× ・ Dark Illusion× ・ Hallucination Walk× ・ New Poison Research× ・ New Poison Creation× ・ Phantom Menace× ・ Poisonous Smoke× ・ Poisonous Weapon× ・ Rolling Cutter× ・ Venom Impression× ・ Venom Pressure× ・ Weapon Blocking× ・ Weapon Crush× Quests Assassin Job Change Guide ・ Assassin Skill Quest ・ Rebirth Walkthrough ・ Guillotine Cross Job Change Guide Weapons× Dagger× ・ Katar× ・ One Handed Sword× Categories Articles Needing DB Links | Quest Window Quests | Assassin | Assassin Cross | Job Change Guide | Guillotine Cross
https://w.atwiki.jp/yu-gi-oh-2chdic/pages/448.html
CROSS GAME(くろすげーむ) 作詞:アリス九號. 作曲:将 編曲:アリス九號.、宅見将典 アーティスト:アリス九號.(現・Alice Nine) 遊戯王5D sの二代目ED。 先の展開のを暗示するカットがいくつかちりばめられており、視聴者に予想する楽しみを与えた。 それらの伏線は回収されたが、パワー・ツール・ドラゴンとの関連があるのではないかと予想されていた黄色い龍の謎は結局このEDが放映されている間には明かされなかった。 ちなみに、最後のダイダロスブリッジから飛び出すシーンも、ED放映期間のずっと後に(少し妙な形で)伏線回収された。 アリス九號.は、歴代の遊戯王主題歌を歌っているアーティストの中では割とメジャーな方で、この曲もオリコン初登場8位を記録している。 なお、アリス九號.は現在はバンド名を「Alice Nine」に改名しており、 「遊☆戯☆王5D's VOCAL BEST!!」では「Alice Nine」名義で収録されている。
https://w.atwiki.jp/tmiya/pages/133.html
scala.swing パッケージ The scala.swing package Ingo Maier November 1, 2009 英語PDF 1 紹介 (Introduction) scala.swing パッケージは Java Swing クラスの周りに、薄いラッパーのコレクションを提供します。 我々の目標は、Scala 中で自然に使えると同時に、既存の Swing プログラミング経験のある Java プログラマーも気にいる、Java Swing に十分近いライブラリを配布することです。 このドキュメントは Scala における Swing プログラミングの簡単な紹介であり、scala.swing 中の利用可能なクラスを概観し、そのデザイン原則を示します。最後に、ライブラリ拡張者が追加ラッパーを書くときに従うべきガイドラインを示します。 このドキュメント全体を通して、scala.swing ディストリビューションの一部である scala.swing.test パッケージ中の例を参照します。 読者には、少なくとも Scala についての基本的知識と、Java Swing あるいは似たような GUI ツールキットのある程度の経験が必要とされます。Scala の一般的な紹介については、http //www.scala-lang.org/node/1305 を参照してください。scala.swing の基本を含む、より包括的な紹介については、本『Programing in Scala』[1]を推奨します。Java Swing の良いチュートリアルは http //java.sun.com/docs/books/tutorial/uiswing にあります。 2 はじめ (Getting started) 次の図 1 で示す例は、コンパイルして簡単な "Hello World" scala.swing プログラムを生成します。 import swing._ object HelloWorld extends SimpleSwingApplication { def top = new MainFrame { title = "Hello, World!" contents = new Button { text = "Click Me!" } } } #ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。 図 1 簡単な "Hello World!" アプリケーションのフレーム たいていの簡単な scala.swing アプリケーションは、上記の HelloWorld のような、クラス SimpleSwingApplication(*1) を拡張するメインオブジェクトから成ります、メインオブジェクトは、引数をとらず、Frame あるいはこの場合 MainFrame を返す、メソッド top を実装する必要があります。フレームは、閉じるボタンやリサイズハンドルのような飾りをもつ、OS の通常の表示窓です。 MainFrame はフレームであり、閉じるときに自動的にアプリケーションを停止し、上記のようにただ 1 つのフレームだけを必要とする大部分のアプリケーションで使われています。 (*1) SimpleGUIApplication は Scala 2.8 では クラス SimpleSwingApplication に置き換わりました。 起動時は、クラス SimpleSwingApplication は Swing フレームワークの初期化を行い、メソッド top によって返されるフレームを開きます。上の実装は、メンバーの初期化に scala.swing の標準的な構文を使ってメインフレームを生成します。本当は、次の式をもつ無名クラスを生成しています。 new MainFrame { title = "Hello, World!" contents = new Button { text = "Click Me!" } } 無名クラス構文により、弓カッコ内のクラス MainFrame のすべてのメンバーにアクセスできます。フレームのタイトルプロパティを文字列 "Hello、World!" に設定し、フレームのコンテンツを、"Click Me!" と書いてある、クリックされても何もしないシンプルなクリックボタンに設定しています。 多くのクラスでは、Java Swing が提供するものに似た少数の便利なコンストラクタを提供し、コンポーネント生成をより簡潔にしています。上記のボタンインスタンス化は、次のようにも書けます。 contents = new Button("Click Me!") しかし、より多数のプロパティ設定では、プロパティに明示的に名前をつけると scala.swing コードが分かり易くなることがよくあるので、一般的には無名クラス構文の使用が望ましいです。 2.1 クラス SwingApplication と SimpleSwingApplication 上記の クラス SimpleSwingApplication は、デフォルト main メソッドを実装する SwingApplication を拡張しています。それはさらに次の 3 つのメソッドを提供します。 def startup(args Array[String]) def quit() { ... } def shutdown() { ... } メソッド startup は、デフォルト main メソッド実装中で呼び出され、クライアントによって実装される必要があります。これは Swing イベントディスパッチングのスレッド上で呼び出されます。メソッド quit は、アプリケーションを潔く停止するときに呼び出されるべきです。それは、アプリケーションを最終的に終了させる前に、最後のステップとしてメソッド shutdown を呼び出します。リソースをクリーンアップし、シャットダウンで特定のコードを実行する必要があるクライアントは、メソッド shutdownを上書きすべきです。 サブクラス SimpleSwingApplication は、メソッド startup のデフォルト実装を提供していて、それは、クライアントが実装したメソッド top によって返さるフレームを表示します。 我々の手法が、http //java.sun.com/developer/technicalArticles/javase/swingappfr/ において導入された Java Swing アプリケーションフレームワークに似てはいるがよりシンプルであることに言及しておきます。 3 レイアウトコンポーネント (Laying out components) 前に、フレームにボタンを加える方法を見ました。より複雑なレイアウトに対しては、コンテナ内にコンポーネントをネストし、特定のルールに従って、それら子コンポーネントを配置します。Java Swing と同じく scala.swing にも、コンテナコンポーネントに 2 つの型、ペインとパネルがあります。ペインは、可能なら各ペインに特有の装飾と一緒に、決まった数の子コンポーネントを表示します。1 つの例は分割ペインです。それは 2 つのコンポーネントを水平あるいは垂直に並べて表示し、そのあいだにノブをいれて、ユーザーが 2 つのコンポーネントの広さを調整できるようにします。もう 1 つの例はスクロールペインです。それはスクロールバーのついたキャンバスの中にただ一つのコンポーネントを置きます。 他方、パネルは、クライアントがある程度カスタマイズ可能なレイアウトルールに従って、任意数の子コンポーネントを配置するコンテナです。 3.1 強く型付けされた、簡潔なコンテナインターフェース (A strongly typed, concise container interface) Java Swing では、コンテナは特定のレイアウトマネージャからは切り離されています。Java Swing コンテナを生成するために、次のように、クライアントは適切なレイアウトマネージャと一緒に JPanel コンポーネントを使います。 val panel = new JPanel() panel.setLayout(new BorderLayout()) java.awt.Component 基底クラスの add メソッドの 1 つを使って、コンポーネントを加えることができます。 def add(comp Component, constraints Object) Component def add(comp Component, index Int) Component def add(comp Component,constraints Object, index Int) Component 次は、上のパネルに、Borderlayout マネージャ ルックスのボタンを加えます。 panel.add(new JButton("click me"), BorderLayout.CENTER) JPanel.add メソッドは、与えられたコンポーネントとそのレイアウト制約を利用できるようにする共通のインターフェースを介して、レイアウトマネージャを呼び出します。Java Swing と異なり、scala.swing 中のコンテナとレイアウトマネージャは繋がっています。これにより、インターフェースがより簡潔になり、コンパイル時により多くの型エラーを検出できます。Java Swing では、上記 add メソッのインターフェースで示されるように、レイアウト制約は、型 Object あるいは Int でなければなりません。型引数としてレイアウトマネージャと制約型をとるジェネリックなパネルクラスは、もっと良く型付けできますが、より複雑なインターフェースとなります。 class JGenericPanel[L LayoutManager[C], C LayoutConstraint] extends JComponent { protected def layout L def add(comp Component, constraints C) = { ... layout.addLayoutComponent(comp, constraints) ... } } さらにまた、レイアウトマネージャとコンテナにオブジェクト合成を使っても、何も柔軟性を得られません。なぜなら、レイアウトマネージャを変えることは必然的に、すべての子コンポーネントに対して相容れない制約を再設定することになるからです。これは、新しいコンテナを生成しすべての子コンポーネントを読み出すのと同じ量の仕事になります。 上記 2 つの議論から、次の統一されたレイアウトコンテナのインターフェースが導かれます。 trait LayoutContainer extends Container.Wrapper { type Constraints AnyRef val layout Map[Component, Constraints] = ... protected def constraintsFor(c Component) Constraints protected def areValid(c Constraints) (Boolean, String) protected def add(comp Component, c Constraints) } コンポーネントをレイアウトマップに加えることで、それらを、型 Constraints の制約に関連づけできます。 3.2 LayoutContainer の拡張 (Extending LayoutContainer) LayoutContainer の具象サブクラスは、抽象 Contraints 型を修正し、ラッパーを基盤のピアへ接続する次の 3 つのメソッドを追加実装する必要があります。 constraintsFor(c Component) Constraints 与えられたコンポーネントの現在の制約を入手します。 areValid(c Constraints) (Boolean, String) 与えられた制約が有効かどうか決定するための実行時チェックを行い、もし有効でなければ、Option型でエラーメッセージを提供します。 add(comp Component, c Constraints) このコンテナに、与えられた制約をもつ与えられたコンポーネントを加えます。 Subclass BorderPanel, for instance, assigns the Contraints type to a custom Position enumeration and obtains the constraints from the underlying layout_manager while performing some casting operations. たとえば、サブクラス BorderPanel は、カスタムの Position 列挙に Contraints 型を割り当て、そしていくつかのキャスト操作を実行している間に、基盤のレイアウトマネージャから制約を入手します。有効な Position 列挙値だけなので、メソッド areValid はどのような実行時チェックもする必要が無く、常に (true、" ") を返します。BorderPanel にコンポーネントを加えるのは、たいていの場合、簡単で、単に適切な引数で JPanel.add メソッドを呼び出すことです。 class BorderPanel extends Panel with LayoutContainer { import BorderPanel._ def layoutManager = peer.getLayout.asInstanceOf[BorderLayout] type Constraints = Position.Value protected def constraintsFor(comp Component) = wrapPosition(layoutManager.getConstraints(comp.peer).asInstanceOf[String]) protected def areValid(c Constraints) (Boolean, String) = (true, "") protected def add(c Component, l Constraints) { peer.add(c.peer, l.toString) } } 4 イベントへの反応 (Reacting to events) scala.swing 中のイベントの監視と反応は、発行者とリアクタ(反応者)のコンセプトをベースにしています。あらゆる scala.swing コンポーネントは、自動的に、イベントを発行する発行者およびイベントに反応するリアクタの両方です。図 2 で描かれたシンプルな Celsius から Fahrenheit への変換器をどのように実装できるか見ていきましょう。 最初に、2 つのそっくりなテキストフィールドをもつフレームを生成し、ユーザーが Celsius と Fahrenheit で温度を入力できるようにします。 #ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。 図 2 シンプルな Celsius から Fahrenheit への変換器 object Converter extends SimpleSwingApplication { def newField = new TextField { text = "0" columns = 5 } val celsius = newField val fahrenheit = newField def top = new MainFrame { title = "Convert Celsius / Fahrenheit" contents = new FlowPanel(celsius, new Label(" Celsius = "), fahrenheit, new Label(" Fahrenheit")) } } テキストフィールドは、型 EditDone のイベント発行者であり、このイベントは、ユーザーがフィールドをちょうど編集し終えたことを示します。それらのイベントに反応するために、テキストフィールドを監視するリアクタにリアクションを加える必要があります。SimpleSwingApplication はアプリケーションのデフォルトのグローバルなリアクタであり、それを拡張するメインオブジェクト Converter に、次のコードを入れることができます。 listenTo(fahrenheit, celsius) reactions += { case EditDone(`fahrenheit`) = val f = Integer.parseInt(fahrenheit.text) val c = (f - 32) * 5 / 9 celsius.text = c.toString case EditDone(`celsius`) = val c = Integer.parseInt(celsius.text) val f = c * 9 / 5 + 32 fahrenheit.text = f.toString } 最初に、クラス Reactor のメソッド listenTo を呼び出すことで、メインオブジェクトが各テキストフィールドからのイベントを待つことを指示します。Reactor は SimpleSwingApplication の基底クラスです。次に、テキストフィールド celsius とテキストフィールド fahrenheit からの EditDone イベントに 2 つのリアクションを加えます。このリアクションはそれぞれ、編集されなかった他方のコンテンツを更新します。イベントは通常ケースクラス、あるいは抽出子(extractor)をもつクラスであり、上記の例のように、クライアントはそれらを容易にパターンマッチできます。 この例の完全なソースコードは、scala.swing テストパッケージにあります。 4.1 Java Swing Listeners 対 scala.swing Reactions 上述で見たように、scala.swing 中のイベントはパターンマッチング中でディスパッチされます。各イベントは普通の Scala オブジェクトなので、パターンマッチ方法を決定するただ一つの型を持ちます。これを Java Swing と対比してみてください。Java Swing では、それらの型プラス追加のリスナーメソッドに応じて 2 つのフェーズでディスパッチします。次の例は、Java Swing 中でのマウスクリックイベントの監視方法を示します。 new JComponent { addMouseListener(new MouseAdapter { @Override def mouseClicked(e MouseEvent) { System.out.println("Mouse clicked at " + e.getPoint) } }) } ここで、インターフェース MouseListener のすべてのメソッドを実装する便利なクラス MouseAdapter を使って、MouseListener の他メソッドの実装を避けていることに注意してください。 This interface is one example were we first dispatch on the event's Java type (MouseEvent) and then refine the match by implementing one of the listener's methods which all take the same parameter (using listener MouseListener and method mouseClicked). このインターフェースは、最初にイベントの Java 型 (MouseEvent)に応じてディスパッチし、次に、すべて同じパラメータをとるリスナーのメソッドの 1 つを実装することで(リスナー MouseListener とメソッド mouseClicked を使います)、マッチイングを改善する 1 つの例です。scala.swing において、イベントの型に応じてマッチする等価なものは、次のようです。 new Component { listenTo(mouse) reactions += { case e MouseClicked = println("Mouse clicked at " + e.point) } } 効率の点から、マウスイベントはコンポーネント自身ではなく、そのメンバー mouse によって発行されます。そのため、最初にマウス発行者を listenTo しなければなりません。 4.2 発行者とリアクタ (Publishers and Reactors) 発行/リアクト システム全体は、クラス Publisher、Reactor、Reactions 中で実装されます。API ユーザーにとって、Publisher 中で唯一興味を引くメソッドは次です。 def publish(e Event) これは、登録された全てのリアクタに通知を行います。トレイト Event の唯一の目的は今のところ、あるクラスがイベントを定義することを示すことです。オブジェクトを発行者にするには、クラス Publisher を拡張して、イベントを発行させる上記のメソッドを呼び出すだけです。クラス Reactor 中の次のメソッドを使って、1 つ以上の発行者にリアクタの登録と登録解除を行えます。 def listenTo(ps Publisher*) def deafTo(ps Publisher*) クラス Reactor の 3 つめに興味を引くメンバーは次です val reactions Reactions これは、リアクションのコレクションを表します。リアクションは、型 Reactions.Reaction のオブジェクトであり、PartialFunction[Event,Unit] のエイリアスです。上記で、リアクションをメソッド += を使って加える方法を見てきました。クラス Reaction の他の興味を引くメソッド -= は、前に登録されたリアクションを撤去します。両方のメソッドとも、受け取ったリアクションオブジェクトを返します。 def +=(r Reactions.Reaction) this.type def -=(r Reactions.Reaction) this.type このことによりクライアントは、一つのリアクションの撤去や付加を構文上連結して書けます。 4.3 アクション(Actions) Java Swing は、イベントへのリアクションとして実行されるコードをカプセル化する、インターフェース javax.swing.Action を提供します。リスナーと異なりますが、しかしアクションもまた、ユーザーインターフェースコンポーネントのいくつかの型に関して役に立つ情報を保存します。しばしば使われるプロパティには、アクションの名称があります。それは通常、ボタンタイトル、あるいはメニュー項目のタイトルと、(各種のボタンとメニュー項目に対するキーボード・ショートカットに使用される)アクションのニーモニックキーとして表示されます。アクションのプロパティの完全なリストについては、http //java.sun.com/docs/books/tutorial/uiswing/misc/action.html を参照してください。 scala.swing では、コンポーネントに似た Java Swing ピア周りのラッパーである Action トレイトによって、アクションを表現します。Action コンパニオンオブジェクトは、いくつかの便利なメンバーを定義しています。次のメソッドにより、クライアントは大変手軽にアクションを生成できます。 def apply(title String)(block = Unit) = new Action(title) { def apply() { block } } 次のように書いて、アクションを生成できます。 Action("Run me") { println("Someone executed this action.") } コンポーネントをアクションに関連づけるには、トレイト Action.Triger を拡張します。次は、クリックボタンにアクションを関連づける 1 つの方法です。 val button = new Button { action = Action("Click me") { println("Someone executed clicked button " + this) } } ボタンがアクションを持つのは非常に一般的なので、コンパニオンオブジェクト Button 中に便利なファクトリメソッドがあります。次は、前の例と等価です。 val button = Button("Click me") { println("Someone executed clicked button " + this) } アクションをもつコンポーネントは、アクションの情報を必要なだけ使います。ボタンとメニュー項目は、通常それらのアクションの本体、名前、アクセラレータ・キー、アイコンその他を使いますが、テキストフィールドはアクションの本体のみ使うことがあります。コンポーネントが関連するアクションを持っていないと言うためには、コンポーネントのアクションのデフォルト値である Action.NoAction オブジェクトを使わなくてはなりません。 button.action = Action.NoAction NoAction をもつコンポーネントは、アクションのプロパティの代わりにそれ自身のプロパティを使います。Java Swing で、NoAction と等価なものは null です。 5 List Views と Tables リストビューとテーブルは、任意数のアイテムを均一な配置で表示するコンポーネントです。リストビューは、各アイテムを単純に水平あるいは垂直に配置し、図 5 のように、各アイテムはしばしば単純な文字列として描画されます。テーブルは要素を格子中に配置し、図 6 のように、オプションで行と列ヘッダーを表示します。 5.1 クラス ListView クラス ListView は、パラメータにアイテムのシーケンスをとる便利なコンストラクタを持っています。リストビューは、次のようにインスタンス化できます。 val items = List("Lausanne", "Paris", "New York", "Berlin", "Tokio") val view = new ListView(items) #ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。 図 3 ListView コンポーネント #ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。 図 4 Table コンポーネント Java Swing と対照して、ListView とそのコンストラクタは、アイテム型について多相的です。 class ListView[A] extends Component { def this(items Seq[A]) = ... ... } ListView はメンバー選択を定義していて、それによりクライアントは、現在の選択状況を問いあわせできます。たとえば、現在選択されているアイテムのシーケンスです。 クラス ListView がジェネリックであることがどれだけ有益であるか見るために、上の例を少し修正してみましょう。 case class City(name String, country String, population Int, capital Boolean ) val items = List(City("Lausanne", "Switzerland", 129273, false), City("Paris", "France", 2203817, true), City("New York", "USA", 8363710 , false), City("Berlin", "Germany", 3416300, true), City("Tokio", "Japan", 12787981, true)) val view = new ListView(items) 今度は、現在選択されているアイテムを問いあわせて、すぐに操作できる City オブジェクトのシーケンスを受け取ることができます。 val cityNames = view.selection.items.map(_.name) Java Swing では、キャストを実行するか、選択されたインデックスのリストを経なければならず、そのどちらもエラーを起こしがちで簡潔でないコードになります。 5.2 レンダラ (Renderers) もし実際に 上記から city オブジェクトを表示するリストビューコードを取り除いて、それをフレームの中に置くと、結果は図 7 のようになるでしょう。 #ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。 図 5 City オブジェクトのリストを表示する ListView コンポーネント こうなるのは、デフォルトでは、リストビューはそのアイテム上で toString を呼び出し、文字列を含むラベルとしてそれぞれを表示するからです。City のようなケースクラスに対して、メソッド toString はクラス名とそのコンストラクタ引数からなる文字列を返すので、図 7 に描かれたような結果になります。 形の上では、クラス ListView は、クラス ListView.Renderer のインスタンスを使って各アイテムをレンダー(描画)します。コンパニオンオブジェクト ListView は、クライアントの役に立つ、多数のレンダラ関連のメンバーを持っています。オブジェクト GenericRenderer は、Java Swing によって与えられたデフォルトレンダラのラッパーであり、上記のように、各アイテムに対して toString を呼び出します。 コンパニオンオブジェクト Renderer は、次の合成メソッドを定義しています。 def apply[A,B](f A = B)(implicit renderer Renderer[B]) Renderer[A] これは、アイテム型 B に対して暗黙のうちに供給されたレンダラを使う、アイテム型 A のレンダラを返します。結果として生じるレンダラは、関数 f を各アイテムに適用することで、型 B のアイテムを入手します。この関数と暗黙の GenericRenderer オブジェクトを使って、もっと良い city ビューを生成できます。 import ListView._ val view = new ListView(items) { renderer = Renderer(_.name) } オブジェクト ListView の最後の役に立つクラスはクラス AbstractRenderer であり、より精巧なアイテムビューを生成できます。そのコンストラクタは、コンポーネント --- その paintComponent メソッドがアイテムを描画する --- を引数にとります。 abstract class AbstractRenderer[-A, C Component](protected val component C) extends Renderer[A] クライアントは、各アイテムにそのコンポーネントを設定するために、次のメソッドを実装する必要があります。 def configure(list ListView[_], isSelected Boolean, focused Boolean, a A, index Int) クラス Item のアイテムを表示するビュー用のメソッド configure は、次のように実装できます。 def configure(list ListView[_], isSelected Boolean, focused Boolean, icon Icon, index Int) { component.icon = icon component.xAlignment = Alignment.Center if(isSelected) { component.border = Swing.LineBorder(list.selectionBackground, 3) } else { component.border = Swing.EmptyBorder(3) } } 似たような例が、サンプルパッケージのコンボボックスのデモ中にあります。 5.3 クラス Table クラス Table とそのレンダラの設計は、ListView とそのレンダラの設計に似ています。しかし クラス Table は、特定の用途向けに作られておらず、アイテムのリスト表示や、たとえば表計算ソフト中の 2 次元配列のようなより一般的な格子データ構造にも使えます。ですから、Table のアイテムは、1 つの列、1 つのカラム、あるいはただ 1 つのセルを表現できます。ですから、クラス Table はジェネリックではありません。 In the future, we might add a generic ListTable class tailored to lists of items similar to cass ListView but in a layout with multiple columns . 将来、我々は、クラス ListView に似てはいるが、複数カラムをもつレイアウトでアイテムのリストに仕立てるジェネリックな ListTable クラスを加えるかもしれません。 6 カスタム描画 (Custom Painting) scala.swing 中のカスタムのコンポーネント描画は、Java Swing に非常によく似ています。コンポーネント中でカスタム描画を実行したいほとんどのユーザーは、Component あるいはそのサブクラスの 1 つをインスタンス化し、メソッド paintComponent をオーバライドしたいでしょう。次は、scala.swing サンプルパッケージの LinePainting デモでのやり方です。 new Component { ... override def paintComponent(g Graphics2D) = { super.paintComponent(g) g.setColor(new Color(100,100,100)) g.drawString("Press left mouse button and drag to paint.", 10, size.height-10) g.setColor(Color.black) g.draw(path) } } これは super.paintComponent() を呼び出し、コンポーネントがその背景と飾りを適切に描画することを確実にしています。次に、カスタムの文字列と、ユーザーがマウスをドラッグしている間デモによって維持されるパスを描画します。 次は、クラス Component で提供される利用可能な描画メソッドです。 protected def paint(g Graphics2D) protected def paintBorder(g Graphics2D) protected def paintChildren(g Graphics2D) protected def paintComponent(g Graphics2D) メソッド paint は、Swing 描画メカニズムによって呼び出され、コンポーネントを描画し、その標準的な実装では他の 3 つのメソッドを起動して、各コンポーネントに特有の飾り、境界線とその子等を描画します。javax.swing.Component 中の対応するメソッドが Graphics オブジェクトをとるのに対して、これら 3 つのメソッドが Graphics2D オブジェクトをとることに注意してください。内部的には、Swing は、あらゆるイベント中の Graphics2D オブジェクトを処理します。scala.swing シグニチャのおかげで、クラス Graphics2D のより新しいインターフェースにアクセスするために、よく使われるキャスト g.asInstanceOf[Graphics2D] をする必要はありません。 カスタム描画の入門については、http //java.sun.com/docs/books/tutorial/ uiswing/painting/index.html を訪れてください。 Graphics2D と補助クラスのような、Swing 図形処理 API の包括的な紹介は、http //java.sun.com/docs/ books/tutorial/2d/index.html にあります。 AWT と Swing 描画メカニズムについての詳細は、http //java.sun.com/products/jfc/tsc/articles/painting/ で論じられています 6.1 メソッドオーバーライドによるカスタマイズ (Customizing by overriding methods) カスタム描画は、メソッドオーバーライドによるより一般的なクラスカスタマイズ方法の 1 例に過ぎません。この方法をラッパーライブラリ中で機能させるために、ピアをインスタンス化するとき、メソッド委譲とミックスイン合成を実行します。 クラス Component 中の描画メソッドの実装は、次のようになります。クラス Component は、次のトレイトを定義します。 protected trait SuperMixin extends JComponent { override def paint(g Graphics) { Component.this.paint(g.asInstanceOf[Graphics2D]) } def __super__paint(g Graphics) { super.paint(g) } このトレイトは、ピアの paint メソッドの呼び出しをラッパーの paint メソッドへリダイレクトし、__super__paint を介してオリジナルの paint メソッドが見えるようします。そうするために、クラス Component は、そのピアへ SuperMixin トレイトをミックスします。 override lazy val peer javax.swing.JComponent = new javax.swing.JComponent with SuperMixin クラス Component 中のメソッド paint のデフォルト実装は、そのピアのオリジナルの paint メソッドを呼び出します。 def paint(g Graphics2D) { peer match { case peer SuperMixin = peer.__super__paint(g) case _ = peer.paint(g) } } 循環を避けるために、ミックスインがあるときは(たとえば、ピアが scala.swing によって生成されているとき) __super__paint メソッドを呼び出します。そうでなければ、単にピアの paint メソッドを呼び出します。 paintComponent のような private および protected のメソッドに対しては、ピアのメソッドを呼び出せません。上の Component.paint 実装中の 2 番目のケースを削らなければなりません。その結果、既存の Java Swing コンポーネント用に生成されたラッパーに対しては、そのようなメソッドは何もしません。 7 ラッパーを書くためのガイドライン (Guidelines for Writing Wrappers) 前章では、 scala.swing の基本的なデザイン原則を概観しました。この章では、新しいラッパーを書くときに考慮すべき、多くの点を列挙、要約します。詳細については、示された章を参照してください。 Java Swing から離れない まず最も重要な原則は、あまりに巧妙にしないことです。オリジナルのデザインから離れないことは、Java Swing に精通した開発者に時間的余裕をもたらします。ピア毎のラッパークラスから始めてください。プロパティは、できる限り同じ名前を維持すべきです。Java のゲッターとセッター( get、set, あるいは booleansに対して is で始まるメソッド)は、Scala ゲッターとセッターに対応するペアに変換し、便利な代入構文と統一アクセス原則を利用できるようにすべきです。他のメソッドは、ピアとラッパーの必要なラッピングとアンラッピングをする、ただの委譲コードであるべきです。この大前提から外れるのは、そうする良い理由がある場合に限ります(例としては、以下を参照)。 共通インターフェースの抽出 Java インターフェースあるいは基底クラスによって表わせない、共通の API を共有する Swing クラスがいくつかあります。1 つの例として、共通のメソッドを共有するが、しかし互いに拡張せず、AWT クラスとは異なる、ウィンドウクラスの部分階層があります(詳細は??参照)。共通インターフェースだけでなく共通ラッパーコード(??)のくくり出しにも、トレイトあるいは(抽象)基底クラスを使ってください。 必要とされるインターフェース(??)にピアを適合させるために、ピアのミックスインを使ってください。もし常にピア生成を管理したければ、トレイトを使ってください。;もしそうしないなら、scala.swing.Oriented 中にあるような構造型を使ってください。 オーバライド可能なメソッドにスーパーのミックスインパターンを使う If a class can be customized by overriding certain methods such_as in custom component painting (6), create a peer mixin that overrides the desired methods each delegating to the respective wrapper_method. Supply a method that lets the wrapper access the original peer method for the default wrapper implementation (6.1) . もしクラスを、カスタムコンポーネント描画(6)中のように、ある特定のメソッドのオーバーライドによってカスタマイズできるなら、それぞれ、ラッパーメソッドへ委譲するのに必要なメソッドをオーバライドする、ピアミックスインを生成してください。 ラッパーがデフォルトのラッパー実装(6.1)に代わってオリジナルのピアメソッドにアクセスできるような、メソッドを提供してください。 抽象と実装トレイトの対を使う Traits that custom widgets can implement in Scala should stay abstract. For a default implementation that delegates to its Java Swing peer, create a trait called Wrapper in the companion_object. Scala 中でカスタムウィジェットが実装できるトレイトは、抽象のままであるべきです。その Java Swing ピアへ委譲するデフォルト実装に対して、コンパニオンオブジェクト中で Wrapper と呼ばれるトレイトを生成してください。例としては、Container と Scrollable を見てください。 Scala コレクション API との統合 Java Swing と Java 標準コレクションとの統合は不完全です。我々はよりうまくやることを目指します。適切な所ではどこでも、Scala コレクションを使ってください。これはプログラマに 2 つの利益をもたらします。第一に、プログラマはすでに知っている強力な API を使うことができます。第二に、Scala 標準コレクションを要求する他の API を用いたコンポーネントあるいはコンポーネントメンバーを使えます。たとえば、scala.swing 中のコンテナクラスを見てください。 あなたの要求を完全に満たす利用可能なコレクションがないなら、上で述べたと同じ理由から、独自のカスタムインターフェースを生成する代わりに、既存のコレクションをサブクラス化してください。 ジェネリック型とメンバー型の使用 ジェネリック型と抽象メンバー型は、より型安全で、適切に使えば、より便利なそして一貫した API を導きます。リストやコンボボックスのような同じ形のアイテムコンテナは、ジェネリック型の理想的な例なのに対して、テーブルは議論の余地がある例です。我々は、標準的な Table クラスの型安全性よりも柔軟性と簡潔性を選びました。それは、目的にふさわしいがより制限された型安全なテーブルの可能性を排除するものではありません。 Member types are sometimes preferable over type_parameters because they can lead to more concise type signatures, e.g., if the member_type needs not to be refined at use site (*2) . メンバー型は、型パラメータよりも望ましいことがしばしばあります。なぜなら、たとえばもしメンバー型を使用場所で修正する必要がないなら、メンバー型はより簡潔な型シグニチャで書けるからです(*2)。レイアウトコンテナにはメンバー型があっています。正確な制約とその意味が、LayoutContainer(3.1)のただ 1 つの具象サブクラスに限定されるからです。言い替えると、もしただ一つの適合している基底クラス、たとえば BorderPanel だけがあるなら、一般的に「BorderPanel.Position 制約をもつレイアウトコンテナ」について話をすることは意味がありません。 (*2) もしそれが一般的なら、ジェネリック型の MyClass[Arg] の代わりに、メンバー型の MyClass { type Param Arg } といつも書くことになります。 型パラメータはコンボボックスとリストには望ましいものです。なぜなら、コンパイラがコンストラクト時にアイテムの型を推論して欲しいからです。コンストラクタ引数中のメンバー型は参照できないので、それはメンバー型ではできません。複雑な型、あるいは、パス依存型のような Scala のより洗練された型システムフィーチャを使う前に、注意深く理性を働かせてください。我々は、そのようなフィーチャが、scala.swing のような伝統的なスタイルの GUI ツールキットの文脈中で役に立つ場面に出会ったことがありません。 便利なコンストラクタあるいはファクトリの提供 少数のプロパティ設定でいつも生成するコンポーネントに対して、便利なコンストラクタを提供してください。もし引数の意味がそれらの場所と型から明らかなら、名前付き引数は避けてください。1 つの文字列と 1 つの整数をとる単純なコンストラクタは問題ありませんが、3 つの文字列をとるコンストラクタは、そうではないでしょう。 scala.swing.Action のように、クロージャを最後の引数として渡すことに意味があるなら、ファクトリメソッドを提供してください。しかしながら、コンストラクタは、無名クラス構文を用いて便利なコンストラクタをミックスできるので、一般的には望ましいです。 フラグを列挙に変える Java Swing が整数フラグを使う場所では、列挙を使ってください。Orientation あるいは Alignment のような scala.swing の既存の列挙を再利用してください。 ラッパーキャッシュの使用 ラッパーを自分で記憶しないでください。これは簡単にメモリリークを引き起こしがちです。組み込みキャッシュを使ってください。あなたのラッパーのコンパニオンオブジェクト(??)中にキャッシュメソッドを提供してください。 独自クラス用に指定された"null"オブジェクトの生成を検討 公開インターフェースで null は決して使わないでください。代わりに Option を考える前に、それらの "null 値" を表現するオブジェクトについて検討してください。例としては、クラス scala.swing.Action とそれに対応する scala.swing.Action.NoAction オブジェクト(4.4)を見てください。この手法は null 参照の共通の欠点を避け、ユーザーとフレームワークコードの両方に関して Options ほど冗長ではありません。 参考文献 (References) [1] Martin_Odersky, Lex Spoon, and Bill Venners. Programming in Scala A Comprehensive Stepby-step Guide.Artima Incorporation, USA, 2008 . SIDライブラリ ページ先頭
https://w.atwiki.jp/bemani2sp/pages/2793.html
GENRE TITLE ARTIST bpm notes CLEAR RATE HARD ELECTRIC POP DIAMOND CROSSING S-C-U vs L.E.D. 180 509 n%(yyyy/mm/dd) 攻略・コメント 逆詐称と思われる。開幕と終盤付近の二重CN地帯はゴミもほとんどなく、HCNの仕様のおかげでゲージが全回復出来てしまう。何度か来る皿複合地帯がこの譜面の中では一番の難所か? -- 名無しさん (2016-06-23 08 29 52) HCNがそこまで複雑でない上に8分主体なので逆詐称レベル。とにかくベホマのHCNを離さない事 -- 名無しさん (2021-05-10 13 57 15) HCNで難易度上げてる印象だけど、中身は☆5くらいだしね -- 名無しさん (2022-02-04 13 44 36) 名前 コメント