現在、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; } }