既存のクラスやインターフェイスは、new の生成時に派生クラスを定義することができ、 匿名クラス、または名前なしクラスと呼ばれます。次のような内部クラスは、匿名クラスに変更できます。
あるクラスの中 { class MyPanel extends JPanel{//---パネル(内部クラスで定義) public void paintComponent(Graphics g){ super.paintComponent(g); if (spriteThread != null) spriteThread.paintTo(g); } };//----------------------ここまでが、JPanel継承クラス定義 JPanel panel = new MyPanel();//生成 }
上と下は、同じ処理になります
あるクラスの中(実際の例) { JPanel panel = new JPanel(){//---パネル(匿名クラスで定義し、生成) public void paintComponent(Graphics g){ super.paintComponent(g); if (spriteThread != null) spriteThread.paintTo(g); } };//----------------------ここまでが、JPanel継承クラス定義 }
匿名クラスクラスには、次の特徴があります。
●コンストラクタを宣言できない
●サブクラスを宣言することができない
●abstractクラスとすることができない
●implements を伴った生成ができない
●暗黙的に final となる
以下で前の内部クラス例を、インターフェイス実装の内部クラスを匿名クラスへ変更した例を示します。
package paint;
import java.awt.*;//Point、Color Graphicsなどのパッケージ
import javax.swing.*;//JPanelのパッケージ
import java.awt.event.*;//ItemListenerなどのリスナーや、イベント用
class ImageFormatPanel extends JPanel{
JComboBox comboBox = new JComboBox(new String[] {"WriterFormatName","ReaderFormatName"} );
ImageList list = new ImageList();
//----インナー(内部)クラス リスト-------------------------------------
class ImageList extends JList
{
DefaultListModel listModel = new DefaultListModel(); //リスト操作用
ImageList(){//コンストラクタコンストラクタがあるので、匿名クラスへは変更できません。
setModel(listModel);
setPreferredSize(new Dimension(240, 180) ); //望むサイズ指定
setWriterFormatName();//書き込み可能な画像ファイルの種類
}
void setList(String []array){
listModel.clear();//リスト項目クリア
for(int i = 0; i < array.length; i++){
listModel.add(i,array[i]);//挿入
}
}
void setWriterFormatName(){//書き込み可能な画像ファイルの種類をセット
String[] formats = javax.imageio.ImageIO.getWriterFormatNames();
setList(formats);
}
void setReaderFormatName(){//読み込み可能な画像ファイルの種類をセット
String[] formats = javax.imageio.ImageIO.getReaderFormatNames();
setList(formats);
}
}//----インナー(内部)クラスの終端--------------------------------------------
public ImageFormatPanel(){//コンストラクタ
this.setLayout(new BorderLayout());
this.add(comboBox, BorderLayout.NORTH);
this.add(new JScrollPane(list), BorderLayout.CENTER);
//----匿名クラス (インターフェイス利用の)--参考→前の名前付き内部クラス-----
ItemListener ItemProc = new ItemListener
{
public void itemStateChanged(ItemEvent e){//ItemListenerの実装メソッド
//項目を変更した時、選択解除前と新しい選択の2つが呼び出されます。
if (e.getStateChange() == ItemEvent.SELECTED){//選択時
int i = comboBox.getSelectedIndex();
if (i == -1) return;
String s = (String)comboBox.getSelectedItem();
if (s.equals("WriterFormatName")){
list.setWriterFormatName();//書き込み可能な画像ファイルの種類をセット
}else if (s.equals("ReaderFormatName")) {
list.setReaderFormatName();//読み込み可能な画像ファイルの種類をセット
}
}
}
}//----インナー(内部)クラスの終端--------------------------------------------
comboBox.addItemListener(itemProc);
}
}
public class ImageFormatList extends JApplet
{
public ImageFormatList(){
this.setContentPane(new ImageFormatPanel());//上記パネルをフレームのパネルとして設定
}
public static void main(String []args){
ImageFormatListFrame frame = new ImageFormatListFrame();
frame.pack();
frame.setVisible(true);
}
}