ファイルアクセス (6/6)
作成:2010-01-14 19:10
更新:2010-01-14 19:10
更新:2010-01-14 19:10
■イメージ読み込みの流れ
Javaでは、イメージ(グラフィックのデータ)は「Image」というクラスとして用意されています。ファイルからグラフィックを読み込むと、このImageのインスタンスとしてJavaの中では扱われるようになります。
そしてGraphicsには、このImageを描画するためのdrawImageというメソッドが用意されています。そこで、基本的な考え方としてはこうなるわけです。
1.まず、Canvasを継承したクラスを作る。
2. その中のpaintメソッドで、Imageが存在したらそれをdrawImageで描画するようにしておく。
3.メインのクラスでは、ボタンを押したらファイルからImageを読み込み、Canvasを再描画するような処理を用意しておく。
これで、おそらく問題ないように思えますね。Canvas継承クラスは、ここではMyCanvasとしてメインのクラスの内部クラスとして用意します。そして、Imageをクラス全体で使えるようにしておきます。 そうすれば、内部クラスのMyCanvasのpaintメソッドでも、メインクラス側にあるImageが使えるようになりますからね。
今回は、イメージファイルの読み込みは「readImageFromFile」というメソッドで行なっています。では、tryの中で何をやっているか見てみましょう。(下リスト参照)
○Toolkitによるイメージ読み込み○
最初の部分はわかりますね。FileDialogでファイルのパスと名前を取り出しています。問題はその後です。「Toolkit tk = Toolkit.getDefaultToolkit();」というのが実行されていますね。これは何でしょう?
このToolkitは「ツールキット」と呼ばれるもので、ネイティブな環境(要するにJava仮想マシンの外側)とのやり取りをするユーティリティ的なクラスと考えて下さい。ここに、ネイティブ環境のためのメソッドがいくつか用意されているんですね。イメージファイルの読み込みメソッドも、この中にあります。
このツールキットを使うには、まず「getDefaultToolkit()」というものでデフォルトのツールキットを取り出します。そして、その中の「getImage()」というので、イメージをImageに読み込みます。
このツールキットというのはちょっと抽象的な概念でややわかりにくいので、とりあえずは「getDefaultToolkitしてからgetImageすればイメージが取りだせる」とだけ覚えちゃって下さい。
○repaintで表示を更新する○
そして、最後に「repaint」というものでMyCanvasを再描画しています。AWTのコンポーネントというのは、3段階で描画が行なわれます。それは、以下のような感じです。
repaint()
↓
update(Graphics g)
↓
paint(Graphics g)
最初のrepaintは、「再描画開始の命令」用のものと考えて下さい。これが呼び出されると、Javaは可能な限りすみやかにupdateを呼び出します。
updateは、コンポーネントの表示部分をきれいに背景色で塗りつぶして消し、それからコンポーネントに必要な表示を描画していきます。そして全て描画し終えたところでpaintメソッドを呼び出します。
つまり、コンポーネントを再描画させたいと思ったら、単にpaintメソッドを呼び出すだけではダメで、repaintを呼び出したほうがよい、ということです。――さあ、これで「イメージをファイルから読み込み表示する」という一連の処理がわかりました!
そしてGraphicsには、このImageを描画するためのdrawImageというメソッドが用意されています。そこで、基本的な考え方としてはこうなるわけです。
1.まず、Canvasを継承したクラスを作る。
2. その中のpaintメソッドで、Imageが存在したらそれをdrawImageで描画するようにしておく。
3.メインのクラスでは、ボタンを押したらファイルからImageを読み込み、Canvasを再描画するような処理を用意しておく。
これで、おそらく問題ないように思えますね。Canvas継承クラスは、ここではMyCanvasとしてメインのクラスの内部クラスとして用意します。そして、Imageをクラス全体で使えるようにしておきます。 そうすれば、内部クラスのMyCanvasのpaintメソッドでも、メインクラス側にあるImageが使えるようになりますからね。
今回は、イメージファイルの読み込みは「readImageFromFile」というメソッドで行なっています。では、tryの中で何をやっているか見てみましょう。(下リスト参照)
○Toolkitによるイメージ読み込み○
最初の部分はわかりますね。FileDialogでファイルのパスと名前を取り出しています。問題はその後です。「Toolkit tk = Toolkit.getDefaultToolkit();」というのが実行されていますね。これは何でしょう?
このToolkitは「ツールキット」と呼ばれるもので、ネイティブな環境(要するにJava仮想マシンの外側)とのやり取りをするユーティリティ的なクラスと考えて下さい。ここに、ネイティブ環境のためのメソッドがいくつか用意されているんですね。イメージファイルの読み込みメソッドも、この中にあります。
このツールキットを使うには、まず「getDefaultToolkit()」というものでデフォルトのツールキットを取り出します。そして、その中の「getImage()」というので、イメージをImageに読み込みます。
このツールキットというのはちょっと抽象的な概念でややわかりにくいので、とりあえずは「getDefaultToolkitしてからgetImageすればイメージが取りだせる」とだけ覚えちゃって下さい。
○repaintで表示を更新する○
そして、最後に「repaint」というものでMyCanvasを再描画しています。AWTのコンポーネントというのは、3段階で描画が行なわれます。それは、以下のような感じです。
repaint()
↓
update(Graphics g)
↓
paint(Graphics g)
最初のrepaintは、「再描画開始の命令」用のものと考えて下さい。これが呼び出されると、Javaは可能な限りすみやかにupdateを呼び出します。
updateは、コンポーネントの表示部分をきれいに背景色で塗りつぶして消し、それからコンポーネントに必要な表示を描画していきます。そして全て描画し終えたところでpaintメソッドを呼び出します。
つまり、コンポーネントを再描画させたいと思ったら、単にpaintメソッドを呼び出すだけではダメで、repaintを呼び出したほうがよい、ということです。――さあ、これで「イメージをファイルから読み込み表示する」という一連の処理がわかりました!
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※イメージ読み込みのメソッド FileDialog fd = new FileDialog(this,"Select Image File.",FileDialog.LOAD); fd.setVisible(true); String fname = fd.getDirectory() + fd.getFile(); Toolkit tk = Toolkit.getDefaultToolkit(); img = tk.getImage(fname); c1.repaint();
※関連コンテンツ