/*
* JFontChooser.java
*
* Created on 2006年11月17日, 上午11:21
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package lbf.swing;
/**
*
* @author lbf
*/
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import javax.swing.event.*;
public class JFontChooser extends JPanel implements ActionListener,ListSelectionListener{
private JDialog jd;//用于顯示模態的窗體
private JComboBox fonts;//用于選擇字體的下拉框
private JList face,size;//用于選擇字形和字號的列表
private JTextField sizeJT;//用于顯示選中的字形和字號
private JButton ok,cancel;//表示選中和取消的按鈕
private Font current;//表示當然選中的字體
private GraphicsEnvironment ge;//表示當前的圖形環境
private JLabel demo;//表示預覽的label
private String fontName="宋體";
private int fontStyle=Font.PLAIN,fontSize=20;
private Frame owner;//表示父類的組件窗體
private Hashtable<String,Integer> ht;//名字到大小的映射
/** Creates a new instance of JFontChooser */
private JFontChooser() {
initOther();
}
private void initOther(){
current=new Font(fontName,fontStyle,fontSize);
ht=new Hashtable<String,Integer>();
sizeJT=new JTextField("20");
sizeJT.setEditable(false);
sizeJT.setBounds(260,40,50,20);
ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] family=ge.getAvailableFontFamilyNames();
fonts=new JComboBox(family);
fonts.setEditable(false);
fonts.setMaximumRowCount(5);
demo=new JLabel("千里冰封 ABCD abcd",JLabel.CENTER);
demo.setFont(current);
String[] faceString={"正常","粗體","斜體","粗體+斜體"};
String[] sizeString={"初號","小初","一號","小一","二號","小二",
"三號","小三","四號","小四","五號","小五","六號","小六","七號",
"八號","5","8","9","10","11","12","14","16","18","20","22","24",
"26","28","36","48","72"};
int[] sizeValue={42,36,26,24,22,18,16,15,14,12,11,9,7,6,5,4,5,8,9,10,11,12,14,16,18,20,
22,24,26,28,36,48,72};
for(int i=0;i<sizeString.length;i++){
ht.put(sizeString[i],sizeValue[i]);
}
face=new JList(faceString);
size=new JList(sizeString);
face.setSelectedIndex(0);
size.setSelectedIndex(25);
fonts.setSelectedItem("宋體");
face.setVisibleRowCount(4);
size.setVisibleRowCount(4);
ok=new JButton("確定");
cancel=new JButton("取消");
ok.addActionListener(this);
cancel.addActionListener(this);
fonts.addActionListener(this);
face.addListSelectionListener(this);
size.addListSelectionListener(this);
}
private void initWindow(String title){
this.setLayout(new BorderLayout());
JLabel fontLabel=new JLabel("字體");
JLabel faceLabel=new JLabel("字形");
JLabel sizeLabel=new JLabel("字號");
fontLabel.setForeground(Color.RED);
faceLabel.setForeground(Color.RED);
sizeLabel.setForeground(Color.RED);
fontLabel.setBounds(20,20,100,20);
faceLabel.setBounds(180,20,80,20);
sizeLabel.setBounds(260,20,50,20);
fonts.setBounds(10,40,127,21);
JScrollPane faceScroll=new JScrollPane(face);
JScrollPane sizeScroll=new JScrollPane(size);
faceScroll.setBounds(180,40,65,100);
sizeScroll.setBounds(260,60,50,80);
JPanel up=new JPanel(null);
JPanel center=new JPanel(new BorderLayout());
JPanel bottom=new JPanel();
up.setPreferredSize(new Dimension(345,160));
up.add(fontLabel);
up.add(faceLabel);
up.add(sizeLabel);
up.add(fonts);
up.add(faceScroll);
up.add(sizeScroll);
up.add(sizeJT);
up.setBorder(BorderFactory.createTitledBorder("選擇區"));
center.add(demo,BorderLayout.CENTER);
center.setBorder(BorderFactory.createTitledBorder("預覽區"));
bottom.add(ok);
bottom.add(cancel);
this.add(up,BorderLayout.NORTH);
this.add(center,BorderLayout.CENTER);
this.add(bottom,BorderLayout.SOUTH);
jd=new JDialog(owner,title,true);
jd.getContentPane().add(this,BorderLayout.CENTER);
jd.setSize(360,360);
jd.setResizable(false);
jd.setLocationRelativeTo(owner);
jd.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
current=null;
jd.dispose();
}
});
jd.setVisible(true);
}
public void actionPerformed(ActionEvent ae){
if(ae.getSource()==fonts){
fontName=(String)fonts.getSelectedItem();
current=new Font(fontName,fontStyle,fontSize);
demo.setFont(current);
this.repaint();
}else if(ae.getSource()==ok){
jd.dispose();
}else if(ae.getSource()==cancel){
current=null;
jd.dispose();
}
}
public void valueChanged(ListSelectionEvent le){
if(le.getSource()==face){
String value=(String)face.getSelectedValue();
if(value.equals("正常")){
fontStyle=Font.PLAIN;
}else if(value.equals("粗體")){
fontStyle=Font.BOLD;
}else if(value.equals("斜體")){
fontStyle=Font.ITALIC;
}else if(value.equals("粗體+斜體")){
fontStyle=Font.ITALIC|Font.BOLD;
}
current=new Font(fontName,fontStyle,fontSize);
demo.setFont(current);
this.repaint();
}else if(le.getSource()==size){
String sizeName=(String)size.getSelectedValue();
sizeJT.setText(sizeName);
fontSize=ht.get(sizeName);
current=new Font(fontName,fontStyle,fontSize);
demo.setFont(current);
this.repaint();
}
}
public static Font showDialog(Frame owner,String title){
JFontChooser jf=new JFontChooser();
jf.initWindow(title);
return jf.current;
}
}
* JFontChooser.java
*
* Created on 2006年11月17日, 上午11:21
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package lbf.swing;
/**
*
* @author lbf
*/
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import javax.swing.event.*;
public class JFontChooser extends JPanel implements ActionListener,ListSelectionListener{
private JDialog jd;//用于顯示模態的窗體
private JComboBox fonts;//用于選擇字體的下拉框
private JList face,size;//用于選擇字形和字號的列表
private JTextField sizeJT;//用于顯示選中的字形和字號
private JButton ok,cancel;//表示選中和取消的按鈕
private Font current;//表示當然選中的字體
private GraphicsEnvironment ge;//表示當前的圖形環境
private JLabel demo;//表示預覽的label
private String fontName="宋體";
private int fontStyle=Font.PLAIN,fontSize=20;
private Frame owner;//表示父類的組件窗體
private Hashtable<String,Integer> ht;//名字到大小的映射
/** Creates a new instance of JFontChooser */
private JFontChooser() {
initOther();
}
private void initOther(){
current=new Font(fontName,fontStyle,fontSize);
ht=new Hashtable<String,Integer>();
sizeJT=new JTextField("20");
sizeJT.setEditable(false);
sizeJT.setBounds(260,40,50,20);
ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] family=ge.getAvailableFontFamilyNames();
fonts=new JComboBox(family);
fonts.setEditable(false);
fonts.setMaximumRowCount(5);
demo=new JLabel("千里冰封 ABCD abcd",JLabel.CENTER);
demo.setFont(current);
String[] faceString={"正常","粗體","斜體","粗體+斜體"};
String[] sizeString={"初號","小初","一號","小一","二號","小二",
"三號","小三","四號","小四","五號","小五","六號","小六","七號",
"八號","5","8","9","10","11","12","14","16","18","20","22","24",
"26","28","36","48","72"};
int[] sizeValue={42,36,26,24,22,18,16,15,14,12,11,9,7,6,5,4,5,8,9,10,11,12,14,16,18,20,
22,24,26,28,36,48,72};
for(int i=0;i<sizeString.length;i++){
ht.put(sizeString[i],sizeValue[i]);
}
face=new JList(faceString);
size=new JList(sizeString);
face.setSelectedIndex(0);
size.setSelectedIndex(25);
fonts.setSelectedItem("宋體");
face.setVisibleRowCount(4);
size.setVisibleRowCount(4);
ok=new JButton("確定");
cancel=new JButton("取消");
ok.addActionListener(this);
cancel.addActionListener(this);
fonts.addActionListener(this);
face.addListSelectionListener(this);
size.addListSelectionListener(this);
}
private void initWindow(String title){
this.setLayout(new BorderLayout());
JLabel fontLabel=new JLabel("字體");
JLabel faceLabel=new JLabel("字形");
JLabel sizeLabel=new JLabel("字號");
fontLabel.setForeground(Color.RED);
faceLabel.setForeground(Color.RED);
sizeLabel.setForeground(Color.RED);
fontLabel.setBounds(20,20,100,20);
faceLabel.setBounds(180,20,80,20);
sizeLabel.setBounds(260,20,50,20);
fonts.setBounds(10,40,127,21);
JScrollPane faceScroll=new JScrollPane(face);
JScrollPane sizeScroll=new JScrollPane(size);
faceScroll.setBounds(180,40,65,100);
sizeScroll.setBounds(260,60,50,80);
JPanel up=new JPanel(null);
JPanel center=new JPanel(new BorderLayout());
JPanel bottom=new JPanel();
up.setPreferredSize(new Dimension(345,160));
up.add(fontLabel);
up.add(faceLabel);
up.add(sizeLabel);
up.add(fonts);
up.add(faceScroll);
up.add(sizeScroll);
up.add(sizeJT);
up.setBorder(BorderFactory.createTitledBorder("選擇區"));
center.add(demo,BorderLayout.CENTER);
center.setBorder(BorderFactory.createTitledBorder("預覽區"));
bottom.add(ok);
bottom.add(cancel);
this.add(up,BorderLayout.NORTH);
this.add(center,BorderLayout.CENTER);
this.add(bottom,BorderLayout.SOUTH);
jd=new JDialog(owner,title,true);
jd.getContentPane().add(this,BorderLayout.CENTER);
jd.setSize(360,360);
jd.setResizable(false);
jd.setLocationRelativeTo(owner);
jd.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
current=null;
jd.dispose();
}
});
jd.setVisible(true);
}
public void actionPerformed(ActionEvent ae){
if(ae.getSource()==fonts){
fontName=(String)fonts.getSelectedItem();
current=new Font(fontName,fontStyle,fontSize);
demo.setFont(current);
this.repaint();
}else if(ae.getSource()==ok){
jd.dispose();
}else if(ae.getSource()==cancel){
current=null;
jd.dispose();
}
}
public void valueChanged(ListSelectionEvent le){
if(le.getSource()==face){
String value=(String)face.getSelectedValue();
if(value.equals("正常")){
fontStyle=Font.PLAIN;
}else if(value.equals("粗體")){
fontStyle=Font.BOLD;
}else if(value.equals("斜體")){
fontStyle=Font.ITALIC;
}else if(value.equals("粗體+斜體")){
fontStyle=Font.ITALIC|Font.BOLD;
}
current=new Font(fontName,fontStyle,fontSize);
demo.setFont(current);
this.repaint();
}else if(le.getSource()==size){
String sizeName=(String)size.getSelectedValue();
sizeJT.setText(sizeName);
fontSize=ht.get(sizeName);
current=new Font(fontName,fontStyle,fontSize);
demo.setFont(current);
this.repaint();
}
}
public static Font showDialog(Frame owner,String title){
JFontChooser jf=new JFontChooser();
jf.initWindow(title);
return jf.current;
}
}
盡管千里冰封
依然擁有晴空
你我共同品味JAVA的濃香.