APIの拙訳
5月24日にnowakay氏に
JFrameでは、paintではなくてpaintComponentをオーバーライドします。
と、教えてもらったので(てか、そんなの初耳なんだけど・・・)、手元の解説書は全く当てにならないからとりあえずJavaAPIを見てみる(ホントは嫌だけど)。
protected void paintComponent(Graphics g)
UI 委譲が null でない場合に、UI 委譲のペイントメソッドを呼び出します。委譲には Graphics オブジェクトのコピーを渡し、残りのペイントコードに対して取り消しできない変更が行われないように保護します (たとえば Graphics.translate など)。
このメソッドをサブクラスでオーバーライドする場合は、渡された Graphics のオブジェクトには永続的な変更は行わないようにします。たとえば Rectangle クリップや変換は変更しません。このような変更が必要な場合は、渡された Graphics から新しい Graphics を生成し、それを変更するほうが容易です。さらに上位オブジェクトの実装を行わない場合は、不透明プロパティに注意する必要があります。つまりこのコンポーネントが不透明な場合は、バックグラウンドには不透明でない色を使用する必要があります。不透明プロパティを無視すると画面が見にくくなります。
パラメータ:
g - 保護対象の Graphics オブジェクト
ほらな!分かんねーんだよ!
ほらほら、またゾロ新しい単語が出てきやがったぜ?
「UI委譲」ってなんだよ。ああン?「ペイントコード」ぉ?「永続的な変更は行わない」?そもそも永続的な変更って何よ?「たとえば」が全っ然わかんね。「つまり」も全っっ然つまってねー。んで「保護対象」って何?ホゴカン(保護監察)の対象?
俺だけが分らないのかと思っていたが、「UI委譲」でググるとこんなページがHIT。
Java小学校ホームルーム「Re: プログラム10-2(2)から」
岩谷 宏
AWT(java.awt)のコンポーネントを自作するときはpaint()を直接オーバライドしますが、Swingのコンポーネント (JComponentの子孫)ではpaintComponent()をオーバライドします。Swingでは、paint()が3つのメソッド (paintBorder(), paintComponent(), paintChildren())を呼び出すからです。引数のないrepaint()はpaint()を呼び出し、そしてpaint()がpaintComponent()を呼び出します。
おお!分りやすい!しかも実際のコーディングにすぐに入れそうな情報付だ!こういうのが欲しかったんだよ!
んで更に、APIのpaintComponent()の説明に対して
[改訳案]
このクラスのUIの実装を担当しているオブジェクト(UI代行, UI delegatte, 具体的には ComponentUIの子孫クラスのオブジェクト…setUI()等で設定する)がnullでなければ、そのpaint()メソッドを呼び出します。呼び出すときにはGraphicsオブジェクトのコピーを渡して、このメソッド内のそのほかの描画コードに呼び出し先での変更(たとえば Graphics.translate()の実行)の影響が及ばないようにします。
このメソッドをサブクラスでオーバライドするときは、メソッドに渡されるGraphicsオブジェクトを変えっぱなしにしてはいけません(変えたらリターン前に必ず元の状態に戻すこと)。たとえばクリップ対象の矩形領域(getClip(), setClip())や座標変換(transform ())を、変えたままではいけません。そういう操作は、メソッドに渡されたGrapphicsオブジェクトのコピーを作って、それを使うほうが簡単です。それにまた、super.paintComponent(g)を呼ばないときには、このクラスの不透明性プロパティ(isOpaque()の返し値)に従った実装をすべきです。つまり、このコンポーネントが不透明(isOpaque()==true)なら、背景を不透明な色で完全に塗りつぶすべきです。クラスの不透明性プロパティを無視したら、画面にへんなものが表示されたりするでしょう。
〔訳注:つまりほとんどの場合、冒頭でsuper.paintComponent(g)を呼んで、不透明性云々の問題をスーパークラスにまかせたほうがよい。〕
うおおー!分りやすいぃぃぃー!!相変わらずUIが何なのかは分らないが、でも、それ以外は何をすれば良いのかちゃんと伝わってくるっ!(と言っても完全には理解し切れていないが、少なくともちょっと勉強すれば理解できそうな希望が持てる。元の訳は絶望を与えてくれた。)
そしてこの訳に対して質問者の感想が
有難うございます。初学ものとして、Documentationを見ても理解しかねるところだらけです。
【後略】
だった。ほら見たかよ!わかんなかったのは俺だけじゃないんだ!
まーつまりアレだ。APIの訳はクソってことだ。
誰よあれ書いたの?
間違いないのは純粋な技術者が書いたってことだ。この純粋ってのがクセモノで、純粋だから技術者以外の人間が読む事を一切考慮してないんだろう。どうせ「これ読めばJava技術者なら元の英文がどうだか分るよね?そしたら何が書いてあるか分るよね?」って感じで訳したんだろう。それとも元の英文の方がクソなのか?
どっちにしても、仲間内の常識が世間の非常識ってことにすら気が付かないどころか、Java技術者以外の存在すら忘れ去っているヤツなんだろうな。30年前から変わってねぇーよなぁー電子計算機の世界は。
(怒りのあまり今日は不良風に書いてみた。)