エージェントモードImage Proxies(二、最も素朴な実装)
3363 ワード
前の『エージェントモードImage Proxies(一、最も素朴な実装)』では、エージェントクラスは以下の通りである.
ここで、次の3つの方法getIconHeight()、getIconWidth()、paintIcon(...)親ImageIconを上書きする方法ですが、次の改善の主な目的は次のとおりです.
「図形描画要求を親ImageIconオブジェクトに転送するのではなく、ImageIcon内のImageオブジェクトを直接操作する方が簡単です」.(一つのImageIconオブジェクトの内部に一つのImageオブジェクトがカプセル化されていることに気づき、ImageIconコンストラクション関数で分かるようになり、またImageIconクラスにはsetImage()メソッドもある)
改善されたクラスは、ShowLoaderとLoadingImageIconの2つで、後者はエージェントです.現在のユーザは内部でloaderを呼び出す.load(frame);の場合、後者は自分の内部の画像を交換し、ウィンドウを再表示します.具体的なコードは添付ファイルを参照してください.
package com.oozinoz.imaging;
/*
* Copyright (c) 2001, 2005. Steven J. Metsker.
*
* Steve Metsker makes no representations or warranties about
* the fitness of this software for any particular purpose,
* including the implied warranty of merchantability.
*
* Please use this software as you wish with the sole
* restriction that you may not claim that you wrote it.
*/
import java.awt.*;
import javax.swing.*;
/**
* This class acts as a proxy for another ImageIcon. In "The Design Patterns
* in Java" we wind up tearing out this class, preferring the techniques
* used in the ImageIconLoader class.
* @author Steven J. Metsker
* @see LoadingImageIcon
*/
public class ImageIconProxy extends ImageIcon implements Runnable {
static final ImageIcon ABSENT = new ImageIcon(ClassLoader.getSystemResource("images/absent.jpg"));
static final ImageIcon LOADING = new ImageIcon(ClassLoader.getSystemResource("images/loading.jpg"));
ImageIcon current = ABSENT;
protected String filename;
protected JFrame callbackFrame;
/**
* Construct an ImageIconProxy that will (on demand) load the image in the
* provided file.
* @param filename the name of a file to load
*/
public ImageIconProxy(String filename) {
super(ABSENT.getImage());
this.filename = filename;
}
/**
* Load the desired image and call back the provided frame when done.
* @param JFrame the frame to repaint when the image is loaded
*/
public void load(JFrame callbackFrame) {
this.callbackFrame = callbackFrame;
current = LOADING;
callbackFrame.repaint();
new Thread(this).start();
}
/**
* Load the desired image (presumably in a separate thread).
*/
public void run() {
current = new ImageIcon(ClassLoader.getSystemResource(filename));
callbackFrame.pack();
}
/**
* @return the height of the Icon
*/
public int getIconHeight() {
return current.getIconHeight();
}
/**
* @return the width of the Icon
*/
public int getIconWidth() {
return current.getIconWidth();
}
/**
* Paint the Icon
*/
public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
current.paintIcon(c, g, x, y);
System.out.println("paintIcon()");
}
}
ここで、次の3つの方法getIconHeight()、getIconWidth()、paintIcon(...)親ImageIconを上書きする方法ですが、次の改善の主な目的は次のとおりです.
「図形描画要求を親ImageIconオブジェクトに転送するのではなく、ImageIcon内のImageオブジェクトを直接操作する方が簡単です」.(一つのImageIconオブジェクトの内部に一つのImageオブジェクトがカプセル化されていることに気づき、ImageIconコンストラクション関数で分かるようになり、またImageIconクラスにはsetImage()メソッドもある)
改善されたクラスは、ShowLoaderとLoadingImageIconの2つで、後者はエージェントです.現在のユーザは内部でloaderを呼び出す.load(frame);の場合、後者は自分の内部の画像を交換し、ウィンドウを再表示します.具体的なコードは添付ファイルを参照してください.