GUI の構成ブロックであるコンポーネントを使用する |
Canvas クラスはサブクラス化されるために存在する。 これ自体は何も行わず、特製の Component を実装する方法を提供するだけで ある。 Canvas は、表示エリア内で発生するイベントを処理したいかどうかにかかわらず、 イメージや特製のグラフィックス用の表示エリアとして有効である。Canvas は、たとえばボタンなど、そのデフォルトの実装とは異なるコントロールを必要とする場合にも有効である。 対応する Component (たとえば Button) をサブクラス化してもそのコントロールの標準の外観を変更することはできないため、代わりに、希望する外観とそのコントロールのデフォルトの動作を併せもった Canvas サブクラスを実装しなければならないのである。
Canvas サブクラスを実装するときは、作成するキャンバスのサイズを適切に反映するように
minimumSize()
とpreferredSize()
メソッド を慎重に実装しなければならない。 そうしないと、キャンバスのコンテナの配置によっては、キャンバスが小さすぎたり 、場合によってはまったく見えないことになりかねない。ここで、Canvas サブクラスである ImageCanvas の 2 つのインスタンスを使用する アプレットを示す。
以下に、ImageCanvas のコードを示す。(電子的な書式は、ImageApplet.java ファイルに納められてい る。) 画像データのダウンロードは非同期で行われるため、ImageCanvas がどのくらいの大きさになるかは作成後しばらく経つまでわからない。 この理由から、ImageCanvas はイメージのサイズデータがわかるまで、作成者の指示 による初期の幅と高さを使用する。 イメージのサイズデータがわかると、ImageCanvas は
preferredSize()
とminimumSize()
メソッドが返すサイズを変更し、それ自身をサイズ変更しようとし、さらに最上位のコンテナのレイアウトが そのサイズにしたがって調整され、再表示されるよう要求する。グラフィックスの描画に関する詳細は、グラフィックスを扱う レッスンを参照する。 特製のグラフィックスの描画とイベント処理を両方とも行う Canvas の実装例については、RectangleDemo アプレットのコードを参照する。 RectangleDemo が動く様子は、形状を描画する で見ることができる。class ImageCanvas extends Canvas { Container pappy; Image image; boolean trueSizeKnown = false; Dimension minSize; int w, h; public ImageCanvas(Image image, Container parent, int initialWidth, int initialHeight) { if (image == null) { System.err.println("Canvas got invalid image object!"); return; } this.image = image; pappy = parent; w = initialWidth; h = initialHeight; minSize = new Dimension(w,h); } public Dimension preferredSize() { return minimumSize(); } public synchronized Dimension minimumSize() { return minSize; } public void paint (Graphics g) { if (image != null) { if (!trueSizeKnown) { int imageWidth = image.getWidth(this); int imageHeight = image.getHeight(this); if ((imageWidth > 0) && (imageHeight > 0)) { trueSizeKnown = true; //コンポーネント主導のサイズ変更 w = imageWidth; h = imageHeight; minSize = new Dimension(w,h); resize(w, h); pappy.layout(); pappy.repaint(); } } g.drawRect(0, 0, w - 1, h - 1); g.drawImage(image, 0, 0, this); } } }
GUI の構成ブロックであるコンポーネントを使用する |