カスタム セル レンダラーを使用してカスタム オブジェクト (カエル) を表示する JList があります。
frogList = new JList<Frog>();
frogModel = new DefaultListModel<Frog>();
frogList.setModel(frogModel);
frogList.setCellRenderer(new FrogBrowserCellRenderer());
//add frogs...
カエルのオブジェクトには画像のリストが含まれており、リストから最新のものを選択して表示します。サムネイルファイルになっているので、メモリに読み込んで表示できます。ただし、ウィンドウが移動するたびに、またはウィンドウを再描画する必要があるたびに JList が再レンダリングされることはわかっています。これは、パフォーマンスが非常に悪く、デザインが良くありません。私が抱えている問題は、このリストが動的であるため、ユーザーが実行時にそれらを追加でき、リストが自動更新されるため、起動時にすべての画像を単純にロードできないことです。
一部の人々は、コンストラクターでイメージをメモリにロードしてgetListCellRendererComponent()
メソッドで設定することに言及しましたが、セル レンダラーを 1 つしか作成せず、リスト内のすべてに使用するため、それは可能ではないようです。また、コンストラクター メソッドを出力してこれを確認しました。さまざまな画像を含むカエルのリストを作成するので、これはあまり意味がありません。
これが、現在サムネイルを作成するために使用しているコードです。
public Image createListThumbnail() {
try {
Image returnImg = null;
//get latest frog image
SiteImage img = frog.getLatestImage();
BufferedImage src = ImageIO.read(new File(XMLFrogDatabase.getImagesFolder()+img.getImageFileName()));
BufferedImage thumbnail = Scalr.resize(src, Scalr.Method.SPEED, Scalr.Mode.FIT_TO_WIDTH, 200, 150, Scalr.OP_ANTIALIAS);
if (!frog.isFullySearchable()){
ImageFilter filter = new GrayFilter(true, 30);
ImageProducer producer = new FilteredImageSource(thumbnail.getSource(), filter);
returnImg = Toolkit.getDefaultToolkit().createImage(producer);
}
return returnImg;
} catch (IOException e) {
IdentiFrog.LOGGER.writeExceptionWithMessage("Unable to generate thumbnail for image (in memory).", e);
}
return null;
}
私はこのメソッドを呼び出すとgetListCellRendererComponent()
パフォーマンスが低下することがわかっていますが、複数のカエルのためにメモリにキャッシュし、1 つのオブジェクトのみを使用する方法がわかりません。もしかしてイメージマップ?これを行う適切な方法の確固たる証拠を見つけることができないようです。