匿名クラス

既存のクラスやインターフェイスは、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);		
	}
}