import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EditorJFrame extends JFrame implements ActionListener, MouseListener
{
private JComboBox combox_name, combox_size; //字體、字號組合框
private JCheckBox checkb_bold, checkb_italic; //粗體、斜體複選框
private JRadioButton radiob_color[]; //顏色單選按鈕
private JTextArea text; //文本區
private Color color; //text的當前文本色
private JPopupMenu popupmenu; //快捷菜單
public EditorJFrame()
{
super("文本編輯器"); //默認BorderLayout佈局
Dimension dim = getToolkit().getScreenSize(); //獲得屏幕分辨率
this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2); //窗口居中
this.setDefaultCloseOperation(EXIT_ON_CLOSE); //窗口關閉時,程序結束
text = new JTextArea("Welcome 歡迎");
text.addMouseListener(this); //文本區註冊鼠標事件監聽器
this.getContentPane().add(new JScrollPane(text)); //文本區添加到滾動窗格,滾動窗格添加到框架內容窗格中部
JToolBar toolbar=new JToolBar(); //創建工具欄,默認水平方向
this.getContentPane().add(toolbar,"North"); //工具欄添加到框架內容窗格北部
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontsName=ge.getAvailableFontFamilyNames(); //獲得系統字體
combox_name = new JComboBox(fontsName); //組合框顯示系統字體
combox_name.addActionListener(this); //組合框註冊單擊事件監聽器
toolbar.add(combox_name);
String sizestr[]={"20","30","40","50","60","70"};
combox_size = new JComboBox(sizestr); //字號組合框
combox_size.setEditable(true); //設置組合框可編輯
combox_size.addActionListener(this); //組合框註冊單擊事件監聽器
toolbar.add(combox_size);
checkb_bold = new JCheckBox("粗體"); //字形複選框
toolbar.add(checkb_bold);
checkb_bold.addActionListener(this); //複選框註冊單擊事件監聽器
checkb_italic = new JCheckBox("斜體");
toolbar.add(checkb_italic);
checkb_italic.addActionListener(this);
String colorstr[]={"紅","綠","藍"};
ButtonGroup bgroup_color = new ButtonGroup(); //按鈕組
radiob_color = new JRadioButton[colorstr.length]; //顏色單選按鈕數組
for (int i=0; i<radiob_color.length; i++)
{
radiob_color[i]=new JRadioButton(colorstr[i]); //顏色單選按鈕
radiob_color[i].addActionListener(this);
bgroup_color.add(radiob_color[i]); //單選按鈕添加到按鈕組
toolbar.add(radiob_color[i]); //單選按鈕添加到工具欄
}
radiob_color[0].setSelected(true); //設置單選按鈕的選中狀態
this.addmyMenu(); //調用自定義方法,添加菜單
this.setVisible(true);
// String password = JOptionPane.showInputDialog(this, "密碼");
// System.out.println(password); //單擊"撤消"按鈕返回null
}
private void addmyMenu() //添加主菜單、快捷菜單、對話框
{
JMenuBar menubar = new JMenuBar(); //菜單欄
this.setJMenuBar(menubar); //框架上添加菜單欄
String menustr[]={"文件","編輯","幫助"};
JMenu menu[]=new JMenu[menustr.length];
for (int i=0; i<menustr.length; i++)
{
menu[i] = new JMenu(menustr[i]); //菜單
menubar.add(menu[i]); //菜單欄中加入菜單
}
menu[0].add(new JMenuItem("打開")); //生成菜單項並加入到菜單
menu[0].add(new JMenuItem("保存"));
menu[0].addSeparator(); //加分隔線
JMenuItem menuitem_exit = new JMenuItem("退出");
menu[0].add(menuitem_exit);
menuitem_exit.addActionListener(this); //菜單項註冊單擊事件監聽器
JMenu menu_style = new JMenu("字形");
menu_style.add(new JCheckBoxMenuItem("粗體"));
menu_style.add(new JCheckBoxMenuItem("斜體"));
/* String stylestr[]={"粗體", "斜體"};
JCheckBoxMenuItem cbmenuitem_style[]=new JCheckBoxMenuItem[stylestr.length];
for (int i=0; i<cbmenuitem_style.length; i++)
{
cbmenuitem_style[i] = new JCheckBoxMenuItem(stylestr[i]); //字形複選菜單項
cbmenuitem_style[i].addItemListener(this);
menu_style.add(cbmenuitem_style[i]);
}*/
menu[1].add(menu_style); //菜單加入到菜單中成爲二級菜單
JMenu menu_color = new JMenu("顏色");
menu[1].add(menu_color);
ButtonGroup buttongroup = new ButtonGroup(); //按鈕組
String colorstr[]={"紅","綠","藍"};
JRadioButtonMenuItem rbmi_color[]=new JRadioButtonMenuItem[colorstr.length];
for (int i=0; i<rbmi_color.length; i++)
{
rbmi_color[i] = new JRadioButtonMenuItem(colorstr[i]); //單選菜單項
buttongroup.add(rbmi_color[i]); //單選菜單項添加到按鈕組
rbmi_color[i].addActionListener(this);
menu_color.add(rbmi_color[i]); //單選菜單項添加到菜單
}
popupmenu = new JPopupMenu(); //快捷菜單對象
String menuitemstr[]={"剪切","複製","粘貼"};
JMenuItem popmenuitem[] = new JMenuItem[menuitemstr.length];
for (int i=0; i<popmenuitem.length; i++)
{
popmenuitem[i] = new JMenuItem(menuitemstr[i]); //菜單項
popupmenu.add(popmenuitem[i]); //快捷菜單加入菜單項
popmenuitem[i].addActionListener(this);
}
popmenuitem[0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));//設置快捷鍵Ctrl+X
popmenuitem[1].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));//設置快捷鍵Ctrl+C
popmenuitem[2].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));//設置快捷鍵Ctrl+V
text.add(popupmenu); //文本區添加快捷菜單
}
public void actionPerformed(ActionEvent e) //單擊事件處理方法
{
if (e.getSource() instanceof JRadioButton) //選擇一個顏色複選框
{
if (e.getSource()==radiob_color[0])
color = new Color(255,0,0);
if (e.getSource()==radiob_color[1])
color = new Color(0,255,0);
if (e.getSource()==radiob_color[2])
color = new Color(0,0,255);
text.setForeground(color); //設置文本區顏色
return;
}
if (e.getSource() instanceof JMenuItem) //單擊菜單項
{
if (e.getActionCommand()=="退出")
if (JOptionPane.showConfirmDialog(this, "終止當前程序運行?")==0)
System.exit(0); //單擊確認對話框中的“是”按鈕,結束程序運行
if (e.getActionCommand()=="剪切")
text.cut(); //將選中文本剪切送系統剪貼板
if (e.getActionCommand()=="複製")
text.copy(); //將選中文本複製送系統剪貼板
if (e.getActionCommand()=="粘貼")
text.paste(); //將剪貼板的文本粘貼在當前位置
return;
}
if (e.getSource() instanceof JComboBox || e.getSource() instanceof JCheckBox)
{ //組合框、複選框
int size=0;
try
{
String fontname = (String)combox_name.getSelectedItem();//獲得字體名
size = Integer.parseInt((String)combox_size.getSelectedItem());//獲得字號
if (size<4 || size>120) //字號超出指定範圍時,拋出異常對象
throw new Exception("SizeException");
java.awt.Font font = text.getFont(); //獲得文本區的當前字體對象
int style = font.getStyle(); //獲得字形
if (e.getSource()==checkb_bold) //粗體
style = style ^ 1; //整數的位運算,異或^
if (e.getSource()==checkb_italic) //斜體
style = style ^ 2;
text.setFont(new Font(fontname, style, size)); //設置文本區字體
}
catch(NumberFormatException nfe)
{
JOptionPane.showMessageDialog(this, "\""+(String)combox_size.getSelectedItem()+"\" 不能轉換成整數,請重新輸入!");
}
catch(Exception ex)
{
if (ex.getMessage()=="SizeException") //捕獲自己拋出的異常對象
JOptionPane.showMessageDialog(this, size+" 字號不合適,請重新輸入!");
}
finally{}
}
if (e.getSource()==combox_size) //單擊字號組合框
{ //將新輸入的字號添加到組合框的下拉列表中,先要查找,不添加重複值
String size = (String)combox_size.getSelectedItem();//獲得當前輸入數據
int i=0, n=combox_size.getItemCount(); //n獲得組合框的選項數
while (i<n && size.compareTo((String)combox_size.getItemAt(i))>=0)
{ //size與組合框的選項比較
if (size.compareTo((String)combox_size.getItemAt(i))==0)
return ; //相同,不插入
i++;
}
combox_size.insertItemAt(size, i); //將size插入在組合框的第i項
}
}
public void mouseClicked(MouseEvent mec) //鼠標事件處理方法,實現MouseListener接口
{
if (mec.getModifiers()==MouseEvent.BUTTON3_MASK) //單擊的是鼠標右鍵
popupmenu.show(text,mec.getX(),mec.getY()); //在鼠標單擊處顯示快捷菜單
}
public void mousePressed(MouseEvent mep) {}
public void mouseReleased(MouseEvent mer) {}
public void mouseEntered(MouseEvent mee) {}
public void mouseExited(MouseEvent mex) {}
public void mouseDragged(MouseEvent med) {}
public static void main(String arg[])
{
new EditorJFrame();
}
}