<課題の評価について> ・レポートの評価は書くアルファベットに各々+、そのまま、−があるの でしょうか?またその範囲はA~Cなのでしょうか。よく分からなかったので教 えていただけたら有難いです。 ↓ 普通に A,B,C,D で A〜C については,+や-がつくことがあります. <一部ソースコードの公開について> ・事前に例などのソースコードを入力してきてくださいという事だったので、 ClickSpeedも打ち込んであったのですが、いざ授業と言う時にソースコードはダ ウンロードできますと言われてちょっとショックを受けまし た。100%無駄にな ったとは思いませんが、予習のために体を削っていることもあるので、公開して くださるソースコードがあるのなら事前に教えていただけると有難いです。 ↓ 理解を深めるために,事前の入力を薦めているのであって省力化のためではありません. 今後も幾つかの例題プログラムは公開する可能性があるが確定しているわけではありません. <授業の進め方について> ・Java既習者にはインターフェースの話題とかつまらんのは仕方ないですね。 ↓ 本来は,知らないからこそ授業を受けるはずなので仕方ないでしょう. ・わかっている人にはくどいだけですが一行一行のプログラム の説明を さらに増やしてほしいです ↓ という意見もある.が,プログラミングの授業ではないので,1行ずつ説明することはあまり考えていません. ・授業についてはやはりプログラムリストの細かな解説が多いので, もっと 大きな枠組みでこのようなことをするにはどうすればよい, などということに ついても触れて欲しいです。 ↓ なるべくバランスをとるように心がける予定です. <画像の取り込みについて> ・グラブを使ってもtiff形式になってしまい,htmlでpngのように書いても表示されずに困りました. ↓ グラブを使えばtiffになり,ショートカットを使えばpngになると説明したはずです. ウェブページの記載を確認してください. <イベント,インタフェースなどについて> ・インターフェースの概念がいまいち分からなかった。多重継承とは別物? ・イベントのクラスとインタフェースの処理がよくわからなかった。 ↓ 授業で説明したように,extends には 1つしか書けないが,implements には複数書けるのが違いです. ・「インターフェースのメソッドはすべて抽象メソッドであるため何もしないメソッドにも定義が必要」という説明がよくわからなかった。 ↓ インタフェースとは,すべてのメソッドが抽象メソッド(シグネチャのみが決まっていて,実体が未定義のメソッド)である. インタフェースを実装する際には,すべてのメソッドの実体を定義しなくてはいけない.と同じような表現になってしまっているが,これはJavaの約束なので,これ以上説明するのはちょっと難しい. <MouseAdapter / MouseListener について> ・例題1〜4は記述が短くなっているが,早さに影響するのだろうか? ↓ 授業でも簡単に話したが,ListenerとAdapterは結局は同じもので, 振舞いはまったく同じと考えて良い(例1はメソッド呼出しが増えているのでやや不利ではあるが…). これらの例題の違いは記述の簡潔さにあると考えた方が適切である. <updateなどの塗りつぶしについて> ・updateメソッドをオーバーライドする等の変更をしても、ウィンドウサイズの変更やアイコン化の際に白 で塗りつぶされてしまうというのを防げなかった ↓ updateは積極的にbackgroundカラーで塗りつぶしを行う. ウィンドウを書き換えると,(updateを呼んでいるわけではなく)キャンバス上の描画結果が失われてしまう. ・update(g);を、repaint();に変更すると、(見かけ上)画面は白く塗りつぶされたままで、マ ウスボタンをプレスしても何も起こらなかった ↓ update(g) は即座に backgroudカラーの塗りつぶしを行うが, repaint() は update(g) と paint(g) を起動するイベントを発生させるだけで, その実行タイミングは保証されていない. おそらくは描画した後に update(g) と paint(g)が呼ばれているためだろう. <Marker.java について> ・(マウスの中ボタンの可否は)Javaの特徴であるところのマルチプラットフォームがうまく行っていないという印象を受けるのだが、 どういうことなのであろうか。これがJavaの欠陥であるのか、Macのシステム操作がそもそも中ボタンのクリック自体を認めていない為にやむを得ないものなのであるのか、詳しく知りたい。 ↓ 授業で説明したが,現在のMacでは中ボタンを許容している. ボタンの数はマウスによっても変わるものであり,振舞いを共通化するといっても無理がある. マウスボタンに限らず,実行環境への依存性が大きいものは,(OSなどに依存する)仮想マシンごとに振舞いが変わるのはいたしかたない. ・(Marker.javaについて)ウィンドウの大きさを変えただけでも描画結果が失われてしまった。ウ ィンドウの大きさを変えると Frame に Canvas がまた 1 から登録されるのだろう か。 ↓ アイコン化と同様に,repaint によって update や paint が実行されている. <Draw.java について> ・線分の色を変えたくて、drawlineの前にこのように入れてみた。 if(x > oldX) setForeground(Color.red); else setForeground(Color.green); 実行してみると、色が変わるたびに線分がリセットされた。 ↓ (おそらく仮想マシン依存で振舞いは変わると思われるが)MouseDragの間は, Graphicsコンテキスト(描画情報)を更新できず,画面の更新まで必要とされるのだろう. Marker.javaのようにボタンの違いで色を変えるのではダメだろうか? ・Draw.javaでマウスボタンを押したまま,ウィンドウ外にはみ出しても,ウィンドウ内に戻ったときには描画ができている.Canvasはウィンドウ外に広がっているのだろうか? ↓ (仮想マシン依存だと思うが)イベントは外に出ても発生しているので,drawLineは呼ばれているだろう.Rubberband.java でも確認ができる. しかし,範囲外でピクセルが存在しないため,描画の記録は残らない(と考えるのが自然). <MouseEventに関して> ・MouseListenerインタフェースでは mouseDragged を受けらなかった. ↓ mouseDraggedは mouse motion に関するイベントなので,MouseMotionListenerを用いる必要がある. ・(RubberbandなどのmouseDraggedで)間隔は何で決まっているのだろうか。元々決まっていて変えられな いのか、それともプログラムで変えられるのか? ↓ 仮想機械依存であり,自由に変更できるわけではない. ・プログラムのタイトルをMouseEventにしていたせいで, このプログラムだけでなくマウスイベントのある全てのプログラムで挙動がおかしくなった ↓ プログラムの名前が「クラス名」であることを理解するにはよい失敗かもしれない. <マウスイベントについて> ・実際にはクリック操作が対応するようなところで mouseClicked メソッドでなく mousePressed メソッドを使っているのはどうしてですか?(例えば例5とか) ↓ mouseClicked のイベントは mouseReleased と同時に生じることが多いが, 押した場所という観点からは mousePressed の位置が自然でしょう. <modifiersのフラグについて> ・(modifiers & MouseEvent.BUTTON3_MASK) != 0 について modifiers と MouseEvent..は完全に一致する必要はないのか? ↓ 授業で説明したはずだが,modifiersは複数のフラグの集合体と考えるべき. ・System.out.println(modifiers)によって調べた結果,情報教育棟の端末では左は16,中は8,右は4のようである.同時押ししてみてもこお三つの内のどれかしかなったので,ビット演算しなくていい気がするが,ループの同じ周回で複数のボタンが押されたら12や24になるのだろうか? ↓ マウスボタンの同時押しはない.しかし,イベント発生時にキーボードの状態,たとえばシフトキーが押されているなど, を調べるためにもmodifiersが利用でき,その際にはビット演算が欠かせません. <Javaプログラミングについて> ・if の条件文の後に{}はつけなくてもよいのだろうか。教科書にはついていなかったが ↓ 文が1つならば {} は不要.{} は複数の文を 1つの文にまとめている. プログラムの書き方として {} をなるべく使うことを推奨している人(達)もいる. <int型とfloat/double型について> ・drawOval においても、どうして int でなければならないのか 未だによくわからない ↓ 授業でも何回か説明しているはずだと思うが,数百×数百個の画素からなる Canvas の位置を示すには, 整数(int型)が自然である.また,逆に HSB のように,[0,1]の実数区間を表すには,float や double でないといけないことも明らかだと思うが… <修飾子について> ・BgMouseAdapterクラスに修飾子がないのは何故であろうか。試しにpublic 修飾子を付けて記述してみるとコンパイルエラーとなった。 ↓ 1つのJavaファイル内で public にしてよいクラスは,ファイル名と一致したクラス名を持つもの 1つとなっている, <継承について> ・extends するクラスのどこまでが継 承されるのか(protected、public だけなのか、アクセス修飾子がついていない ものもなのか、などなど) ↓ 継承によってすべての性質が引き継がれる.アクセス修飾子はアクセスの可否を指定するものでしかない. <プログラムの発展> ・教科書通りに線を描くことができた。 さらに、int型の変数としてSIZE = 30を指定 し、 mouseDraggedメソッドを次のように書き換えると、 右ボタンプレス、ドラッ グで、消しゴムを使用することもできる。 ↓ 実際に自分でプログラムを考えて試してみることは重要です. <プログラムの発展> ・応用として、描いた円がいちいち残るような仕様にすることも考えたが、 ドラッ グに伴うupdateにより、 古い円が残っていても消えてしまう。 よって、mouseReleasedのたびに円のオ ブジェクトを配列か何かに格納すれば、 updateの際に、新しい円と共にその古い円を描画することもできるのではない かと考える。 しかし配列へ格納したとして、updateの際に その「配列のパラメータによって 全てを描画する」メソッドを考えつかなかった。 ↓ 円を表すクラスを定義して,円のオブジェクトをすべて保存し, paintメソッドが起動された際に描画すれば良いでしょう. Javaの配列よりは,Vectorクラスの方が楽だと思います.