学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その43 JFileFilterとLook&Feel(GUIの見た目、操作性)

<<前  [TOP]  次>>


以下の2つのサンプルプログラムを作成してみましょう。


SwingImageFileFilter.java 直

import java.io.*;

public class SwingImageFileFilter extends javax.swing.filechooser.FileFilter {

	/**ファイル表示の設定*/
	public boolean accept(File file) {

		//ディレクトリはそのまま表示
		if(file.isDirectory()) {
			return true;
		}

		//ファイル名に大文字が含まれている場合、小文字に変換
		String name = file.getName().toLowerCase();

		//ファイル名の末尾が下記の文字列の場合は表示
		if(name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".gif")) {
			return true;
		}
		else {
			return false;	//その他は表示しない
		}
	}

	/**「ファイルタイプ」の説明に記述する文字列*/
	public String getDescription() {
		return "Image File (*.jpg, *.jpeg, *.gif)";
	}
}



SwingJFileChooserTest2.java 直

/**ファイルチューザーのテスト*/
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class SwingJFileChooserTest2 implements ActionListener {

	private JFrame frame;
	private JMenu fileMenu;		//メニュー用
	private JMenuItem openItem, quitItem;
	private JLabel label;
	private ImageIcon image;
	private JFileChooser fileChooser;	//ファイルチューザー用

	/**コンストラクタ*/
	public SwingJFileChooserTest2() {
		image = null;			//初期設定のイメージは無し
		label = new JLabel(image);	//空のイメージをラベルに設定

		//ファイルチューザーを開いた時はカレントディレクトリにする
		fileChooser=new JFileChooser(".");
		fileChooser.setFileFilter(new SwingImageFileFilter());

		//ファイルチューザーの見出し
		fileChooser.setDialogTitle("JPEG/GIF");

		//メニューの作成
		JMenuBar menuBar = new JMenuBar();
		fileMenu = new JMenu("FILE");
		openItem = new JMenuItem("Open");
		quitItem = new JMenuItem("Quit");

		fileMenu.add(openItem);
		fileMenu.addSeparator();
		fileMenu.add(quitItem);
		menuBar.add(fileMenu);

		//フレームの生成・表示
		frame = new JFrame("JFileChooserTest1");
                frame.setSize(400,300);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setJMenuBar(menuBar);
		frame.getContentPane().add(label,"Center");
                frame.setVisible(true);

		//イベントの登録
		openItem.addActionListener(this);
		quitItem.addActionListener(this);
	}

	/**メニューが選ばれた時の処理*/
	public void actionPerformed(ActionEvent evt){
		String str = evt.getActionCommand();

		if(str.equals("Open")) {
			fileOpen();
		}
		else if(str.equals("Quit")) {
			System.exit(0);
		}
	}

	/**「Open」を選択した時の処理*/
	public void fileOpen() {

		//「開く」「キャンセル」のチェック(オーナーはnull)
		int state = fileChooser.showOpenDialog(null);

		//選択されたファイルを設定
		File file = fileChooser.getSelectedFile();

		//ファイルが選択(「開く」)された。「file!=null」も忘れずに行う
		if(file != null && state == JFileChooser.APPROVE_OPTION) {

			//選択したファイルからパスを把握してimageを生成する
			image = new ImageIcon(file.getAbsolutePath());

			//ラベルにイメージを設定後、フレーム以下を再配置
			label.setIcon(image);
			frame.validate();
			frame.pack();
		}
		else if(state == JFileChooser.CANCEL_OPTION){
			JOptionPane.showMessageDialog(null,"Cancel!");
		}
		else if(state == JFileChooser.ERROR_OPTION){
			JOptionPane.showMessageDialog(null,"Error!");
		}
	}

	/**main()*/
	public static void main(String[] args){
		new SwingJFileChooserTest2();
	}
}	

SwingImageFileFilter.javaは単独では実行できません。


SwingJFileChooserTest2.javaはSwingJFileChooserTest1.java 直をもとに、ファイルチューザーを生成した後に、以下の部分を付け加えただけです。

fileChooser.setFileFilter(new SwingImageFileeFilter());



ファイルの選択を行う場合、特定の種類のファイルだけを表示したい場合があります。
この場合にはJFileFilterの「setFileFilter(FileFilter)」を使用して、ファイルチューザーへファイルフィルタを設定すればよいです。


引数で与える「FileFilter」はjavax.swing.filechooserパッケージにある抽象クラスなので、このクラスを拡張することになります。

public class ImageFilter extends
    javax.swing.filechooser.FileFilter {

    /** ファイルの表示を決定(ファイル名の末尾が「.jpg」なら表示*/
    public boolean accept(File file) {
        String name = file.getName();   //ファイル名の取得
         if (name.endsWith(".jpg")) {
            return true;
        }
        else {    //「.jpg」以外は表示しない
            return false;
        }
    }

    /** 「ファイルタイプ」の説明を記述するメソッド*/
    public String getDescription() {
        return "イメージファイル(*.jpg)";
    }
}



では、サンプルプログラムを実行してみましょう。
ファイルのオープンを選択することが出来ます。
「file」メニューから「open」を選択すると、ファイルの一覧が表示されます。
画像ファイルのあるフォルダへ移動し、ファイルを選択すると、選択した画像が表示されます。
取り消しを押すと、「cancel」というメッセージが表示されます。
ファイルタイプが「.jpg」「.jpeg」「.gif」の三種類のみ表示されるようになります。











以下のサンプルプログラムを作成してみましょう。


SwingUITest1.java 直

/**UIの状況確認*/

import javax.swing.*;

public class SwingUITest1 {

	/**main()*/
	public static void main(String[] args) {
		UIManager uiM = new UIManager();

		//デフォルトのLook&Feelのクラス名を表示
		System.out.println("SwingデフォルトLook&Feel = "+ uiM.getCrossPlatformLookAndFeelClassName());

		//使用しているOS
		System.out.println("OS= "+ System.getProperty("os.name"));

		//使用しているOS用のLook&Feelのクラス名を表示
		System.out.println("System Look&Feel= " + uiM.getSystemLookAndFeelClassName());

		//登録されているLook&Feelを取得
		UIManager.LookAndFeelInfo[] lafs = uiM.getInstalledLookAndFeels();

		//登録されているLook&Feelの数を表示
		System.out.println("登録種類=" + lafs.length);

		//Look&Feelの名前とクラス名を表示
		for(int i=0; i<lafs.length;i++){
			System.out.println(lafs[i].getName() + "= " + lafs[i].getClassName());
		}
	}
}



Swingでは、Look&Feel(GUIの見た目、操作性)を適宜設定できます。


Look&Feelに関しては、javax.swingパッケージの「LookAndFeel」「UIDefaults」「UIManager」を押さえておけばよいでしょう。


「LookAndFeel」は、様々なLook&Feelの基となります。
このクラスから、「BasicLookAndFeel」→「MetalLookAndFeel」「WindowsLookAndFeel」が作られます。


LookAndFeelクラスは抽象クラスで、プラグイン可能なLook&Feelの特性を定義すると同時に、特性を知るための簡易メソッドなどが提供されています。


特性には「名前」「ID」「ネイティブのLook&Feelか」「Look&Feelがサポートしているか」などがあります。


UIDefaultsクラスには、Swingコンポーネントの各種情報(色、フォントなど)が記述されています。
変更の必要がある場合は、UIManagerを通して変更してください。


UIManagerクラスは、主に現在使用可能なLook&Feelを調べるために使用し、以下のようなことが分かります。

  • インストール済みのLook&Feel
  • 現在のLook&Feel
  • Look&Feelのクラス名

    UIManager uiM = new UIManager();
    
    //Look & Feelの初期設定クラス名を表示
    System.out.println(uiM.getCrossPlatformLookAndFeelClassName());
    
    //使用しているOS用のLook&Feelのクラス名を表示
    System.out.println(uiM.getSystemLookAndFeelClassName());
    
    //登録されているLook&Feelを取得と名前の表示
    UIManager.LookAndFeelInfo[] lafs = uiM.getInstalledLookAndFeels();
     for (int i=0; i<lafs.length; i++) {
        System.out.println(lafs[i].getName());
    }
    



    Look&Feelの設定は、UIManagerクラスのsetLookAndFeel("Look&Feelのクラス名")で設定することが出来ます。
    その際、SwingUtilities.updateComponentTreeUI(対象コンポーネント)でLook&Feelを変更したい大元のコンポーネントでアップデートしてください。

    JFrame frame = new JFrame("Look&Feel");
    UIManager uiM = new UIManager();
    
    try {
        //Look&FeelをMotifに切り替え
        uiM.setLookAndFeel(
            "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
        SwingUtilities.updateComponentTreeUI(frame);
    }
    catch(UnsupportedLookAndFeelException uex) {
        System.err.println(uex);
    }
    catch(ClassNotFoundException cex) {
        System.err.println(cex);
    }
    catch(InstantiationException iex) {
        System.err.println(iex);
    }
    catch(IllegalAccessException iex) {
        System.err.println(iex);
    } 
    



    では、サンプルプログラムを実行してみましょう。
    Look&Feelの情報が表示されます。





    以下のサンプルプログラムを作成してみましょう。


    SwingUITest2.java 直

    /**UI のテスト(Look&Feelの切替え) */
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class SwingUITest2 implements ActionListener {
    
    	private UIManager uiM;
    	private UIManager.LookAndFeelInfo[] laf;	//Look&Feelの情報
    	private JFrame frame;
    
    	/**コンストラクタ*/
    	public SwingUITest2() {
    		SwingBoxPanel box = new SwingBoxPanel();	//BoxPanelを利用
    		JToolBar toolBar = new JToolBar();	//ツールバーの生成
    
    		//UIマネージャーから登録Look&Feel情報の取得
    		uiM = new UIManager();
    		laf = UIManager.getInstalledLookAndFeels();
    
    		//切替えるLook&Feel用のボタンを生成
    		JButton[] button = new JButton[laf.length];
    
    		for(int i=0; i<laf.length; i++) {
    
    			String text = laf[i].getName();
    			button[i] = new JButton(text);	//Look&Feelをボタン名に
    			toolBar.add(button[i]);
    			button[i].addActionListener(this);
    		}
    
    
    		frame = new JFrame("Look&Feel");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().add(toolBar, "North");
    		frame.getContentPane().add(box, "Center");
    		frame.pack();
                    frame.setVisible(true);
    	}
    
    	/**ボタンを押した時の処理*/
    	public void actionPerformed(ActionEvent evt) {
    		String str = evt.getActionCommand();
    		int bid = 0;
    
    		//押されたボタンとLook&Feel名が一致した時の処理
    		for(int i=0; i<laf.length; i++) {
    			if (str.equals(laf[i].getName())){
    				bid=i;
    			}
    		}
    
    		//Look&Feelの切替え
    		try{
    			uiM.setLookAndFeel(laf[bid].getClassName());
    			SwingUtilities.updateComponentTreeUI(frame);
    		}
    		catch(UnsupportedLookAndFeelException uex){
    			System.err.println(uex);
    		}
    		catch(ClassNotFoundException cex){
    			System.err.println(cex);
    		}
    		catch(InstantiationException iex) {
    			System.err.println(iex);
    		}
    		catch(IllegalAccessException iex) {
    			System.err.println(iex);
    		}
    	}
    
    	/**main()*/
    	public static void main(String[] args) {
    		new SwingUITest2();
    	}
    }
    



    では、サンプルプログラムを実行してみましょう。
    このプログラムを実行するには、以前作成した、「SwingBoxPanel.java 直」が必要です。
    Look&Feelの切り替えが出来ます。








    <<前  [TOP]  次>>