現在、BraveLabelとFieldLabelでは、ファイル名が異なる以外は同じ処理を行っています。
なので、共通の処理を別のクラスにまとめるように変更します。
アイコンを表示するためのラベルなので、IconLabelというクラスを作って、BraveLabelとFieldLabelはIconLabelを継承するように設計を変更しましょう。
IconLabelは、表示するファイル名が決まっていないので、インスタンス化されることはありません。このようなクラスを抽象クラスと呼びます。
抽象クラスはクラス宣言に abstract を追加して宣言します。
抽象クラスに対して、BraveLabelとFieldLabelはインスタンス化するクラスなので、具象クラスと呼びます。
Imageはクラス変数として保持するのですが、それらはIconLabelを継承したBraveLabelとFieldLabelのクラスで定義します。
それらの変数にアクセスするためのsetter/getterと、ファイル名を取得するメソッドを抽象メソッドで定義して、サブクラスで実装させることを強制します。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public abstract class IconLabel extends JLabel {
public IconLabel() {
Image image = getImage();
if (image == null) {
ImageIcon icon = new ImageIcon(getImageFilename());
image = icon.getImage().getScaledInstance(RpgFrame.IconWidth, RpgFrame.IconHeight, Image.SCALE_SMOOTH);
setImage(image);
}
setIcon(new ImageIcon(image));
setBackground(Color.WHITE);
setOpaque(true);
setPreferredSize(new Dimension(RpgFrame.IconWidth, RpgFrame.IconHeight));
}
abstract String getImageFilename();
abstract Image getImage();
abstract void setImage(Image image);
}
import java.awt.Image;
public class BraveLabel extends IconLabel {
private static Image image = null;
public BraveLabel() {
super();
}
@Override
String getImageFilename() {
return "brave.png";
}
@Override
Image getImage() {
return image;
}
@Override
void setImage(Image image) {
BraveLabel.image = image;
}
}
import java.awt.Image;
public class FieldLabel extends IconLabel {
private static Image image = null;
public FieldLabel() {
super();
}
@Override
String getImageFilename() {
return "grass.jpg";
}
@Override
Image getImage() {
return image;
}
@Override
void setImage(Image image) {
FieldLabel.image = image;
}
}