FontDialog実装

 Fontを選択するJFontDialogを実装する。

 ■ソースコード

package test;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class JFontDialog extends JDialog {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JList[] list;
	private JLabel label;
	private boolean isCanceld=true;
	private JScrollBar[] scroll;
	
	public JFontDialog(){
		super(JOptionPane.getRootFrame(),true);
		super.setTitle("Font Dialog");
		super.getContentPane().setLayout(new GridLayout(2,1));
		JPanel up=new JPanel(new GridLayout(1,3));
		JPanel bt=new JPanel(new GridLayout(2,1));
		list=new JList[3];
		JScrollPane[] sp=new JScrollPane[3];
		Font font=new Font("Dialog",Font.PLAIN,10);
		scroll=new JScrollBar[3];
		for(int i=0;i<list.length;i++){
			list[i]=new JList();
			list[i].setFont(font);
			sp[i]=new JScrollPane(list[i]);
			sp[i].setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
			scroll[i]=sp[i].getVerticalScrollBar();
		}
		sp[0].setBorder(BorderFactory.createTitledBorder(
				BorderFactory.createLineBorder(Color.GRAY), "Family"));
		sp[1].setBorder(BorderFactory.createTitledBorder(
				BorderFactory.createLineBorder(Color.GRAY), "Style"));
		sp[2].setBorder(BorderFactory.createTitledBorder(
				BorderFactory.createLineBorder(Color.GRAY), "Size"));
		for(int i=0;i<sp.length;i++)up.add(sp[i]);
		super.getContentPane().add(up);
		label=new JLabel("ABCabc123あいう");
		bt.add(label);
		JPanel bp=new JPanel();
		BoxLayout bl=new BoxLayout(bp,BoxLayout.X_AXIS);
		bp.setLayout(bl);
		bp.add(Box.createGlue());
		JButton bt0=new JButton(" O  K ");
		bt0.setFont(font);
		JButton bt1=new JButton("Cancel");
		bt0.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				isCanceld=false;
				setVisible(false);
			}
		});
		bt1.setFont(font);
		bt1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				isCanceld=true;
				setVisible(false);
			}
		});
		bp.add(bt0);
		bp.add(bt1);
		bt.add(bp);
		super.getContentPane().add(bt);
		String[] sysFont=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
		String[] family=new String[sysFont.length+5];
		family[0]="Dialog";
		family[1]="DialogInput";
		family[2]="Monospaced";
		family[3]="Serif";
		family[4]="SansSerif";
		for(int i=0;i<sysFont.length;i++)family[i+5]=sysFont[i];
		String[] style={"PLAIN","BOLD","ITALIC","ITALIC-BOLD"};
        String[] size={"4","5","6","7","8","9","10","11","12","13","14","15",
                "16","18","20","22","24","28","32","36","40","44","48"};
        list[0].setListData(family);
        list[1].setListData(style);
        list[2].setListData(size);
        for(int i=0;i<list.length;i++)list[i].setSelectedIndex(0);
        ListSelectionListener ll=new ListSelectionListener(){
			public void valueChanged(ListSelectionEvent arg0) {
				Font f=getFontToList();
				label.setFont(f);
			}
        };
       for(int i=0;i<list.length;i++)list[i].addListSelectionListener(ll);
       super.setSize(350, 250);
	}
	
	private Font getFontToList(){
		String family=(String)list[0].getSelectedValue();
		int style=Font.PLAIN;
		switch(list[1].getSelectedIndex()){
			case 0:
				style=Font.PLAIN;
				break;
			case 1:
				style=Font.BOLD;
				break;
			case 2:
				style=Font.ITALIC;
				break;
			default:
				style=Font.ITALIC+Font.BOLD;
			break;
		}
		int size=Integer.parseInt((String)list[2].getSelectedValue());
		Font ret=new Font(family,style,size);
		return ret;
	}
	
	public Font getFont(Component c){
		super.setLocationRelativeTo(c);
		Font f=c.getFont();
		if(f!=null){
			String family=f.getFamily();
			list[0].setSelectedValue(family, true);
			setScrollBar(0,list[0].getSelectedIndex());
			int style=f.getStyle();
			switch(style){
				case Font.PLAIN:
					list[1].setSelectedIndex(0);
					break;
				case Font.BOLD:
					list[1].setSelectedIndex(1);
					break;
				case Font.ITALIC:
					list[1].setSelectedIndex(2);
					break;
				default:
					list[1].setSelectedIndex(3);
					break;
			}
			setScrollBar(1,list[1].getSelectedIndex());
			int size=f.getSize();
			list[2].setSelectedValue(Integer.toString(size), true);
			setScrollBar(2,list[2].getSelectedIndex());
		}else{
			list[0].setSelectedIndex(0);
			list[1].setSelectedIndex(0);
			list[2].setSelectedIndex(6);
			setScrollBar(2,list[2].getSelectedIndex());
		}
		super.setVisible(true);
		if(isCanceld){
			return null;
		}else{
			return getFontToList();
		}
	}
	
	private void setScrollBar(int id,int index){
		FontMetrics fm=getFontMetrics(list[id].getFont());
		int h=fm.getHeight();
		scroll[id].setValue(index*h);
	}
	
	public static Font chooseFont(Component c){
		JFontDialog f=new JFontDialog();
		return f.getFont(c);
	}

	public static void main(String[] args){
		Font font=JFontDialog.chooseFont(JOptionPane.getRootFrame());
		System.out.println(font);
		System.exit(0);
	}
}

 ■結果
 起動画面はこんな感じ。