import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
public class EditorJFrame extends JFrame implements ActionListener,MouseListener{
private JTextArea text;//文本区
private JComboBox comboxName,comboxSize;//组合框
private JCheckBox chkBold,chkItalic;//字形复选框
private JRadioButton[] radioColors;//颜色单选按钮数组
private JPopupMenu popMenu;//快捷菜单
private boolean isTrue=true;
private Color color;
private boolean bool=true;
public EditorJFrame(){
super("文本编译器");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//Dimension dim=this.getToolkit().getScreenSize();//获取屏幕分辨率
//this.setBounds(dim.width/4, dim.height/4, dim.width/2, dim.height/2);
this.setSize(800, 600);//设置窗口大小
this.setLocationRelativeTo(null);//设置窗口位置居中
text = new JTextArea("welcome....");
this.getContentPane().add(new JScrollPane(text));
JToolBar toolBar=new JToolBar();//工具栏,默认水平方向
this.getContentPane().add(toolBar,"North");//工具栏添加到框架内容窗格北边
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontsName=ge.getAvailableFontFamilyNames();//获取系统字体
comboxName =new JComboBox(fontsName);//在组合框显示系统字体
comboxName.addActionListener(this);//对组合框注册动作事件监听器
toolBar.add(comboxName);
String[] sizeStr={"20","30","40","50","60"};
comboxSize=new JComboBox(sizeStr);//字号组合框
comboxSize.setEditable(true);//设置组合框为可编辑
comboxSize.addActionListener(this);//组合框注册动作事件监听器
toolBar.add(comboxSize);
chkBold =new JCheckBox("粗体");chkBold.addActionListener(this);toolBar.add(chkBold);
chkItalic=new JCheckBox("斜体");chkItalic.addActionListener(this);toolBar.add(chkItalic);
String[] colorStrs={"红","绿","蓝"};
radioColors=new JRadioButton[colorStrs.length];
ButtonGroup bgroup=new ButtonGroup();
for(int i=0;i<radioColors.length;i++){
radioColors[i]=new JRadioButton(colorStrs[i]);//颜色单选按钮
radioColors[i].addActionListener(this);
bgroup.add(radioColors[i]);
toolBar.add(radioColors[i]);
}
addMyMenu();
text.addMouseListener(this);
this.setVisible(true);
}
private void addMyMenu() {
JMenuBar menuBar=new JMenuBar();
this.setJMenuBar(menuBar);//添加菜单栏
String[] menuStrs={"文件", "编辑", "帮助"};
JMenu[] menu=new JMenu[menuStrs.length];
for(int i=0;i<menu.length;i++){
menu[i]=new JMenu(menuStrs[i]);//菜单
menuBar.add(menu[i]);
}
menu[0].add(new JMenuItem("打开"));menu[0].add(new JMenuItem("保存"));menu[0].addSeparator();//添加菜单项 并与exit之间用线分隔
JMenuItem menuItemExit=new JMenuItem("退出");menuItemExit.setActionCommand("exit");menuItemExit.addActionListener(this);
menu[0].add(menuItemExit);
JMenuItem menuColor=new JMenuItem("颜色");
menu[1].add(menuColor);menuColor.addActionListener(this);
popMenu=new JPopupMenu();//快捷菜单
String[] menuItemStrs={ "剪切", "复制", "粘贴" };
JMenuItem[] popMenuItems=new JMenuItem[menuItemStrs.length];
for(int i=0;i<popMenuItems.length;i++){
popMenuItems[i]=new JMenuItem(menuItemStrs[i]);
popMenu.add(popMenuItems[i]);
popMenuItems[i].addActionListener(this);
}
text.add(popMenu);
}
public static void main(String[] args) {
new EditorJFrame();
}
public void mouseClicked(MouseEvent e) {
if(e.getModifiers()==MouseEvent.BUTTON3_MASK){//显示快捷菜单
popMenu.show(text, e.getX(), e.getY());
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() instanceof JComboBox || e.getSource() instanceof JCheckBox){
//控制输入字体大小为有效数字
try{
bool=!bool;//防止弹出两次异常
if(bool){
return ;
}
String fontName=(String) comboxName.getSelectedItem();
int size=Integer.parseInt((String) comboxSize.getSelectedItem());
if(size<4 || size>120){
isTrue=false;
throw new Exception("SizeException");
}
Font font=text.getFont();
int style=font.getStyle();
if(e.getSource()==chkBold){//字形整数的第0为表示粗体,第一位表示斜体
style=style^1;
}
if(e.getSource()==chkItalic){
style=style^2;
}
text.setFont(new Font(fontName,style,size));
bool=true;
}catch(NumberFormatException e1){
JOptionPane.showMessageDialog(this, "\""+(String)comboxSize.getSelectedItem()+"\"不能转换成整数,请重新输入!");// \" 表示引号
}catch(Exception e2){
if(e2.getMessage().equalsIgnoreCase("SizeException")){
JOptionPane.showMessageDialog(this, "字体不合适,请重新输入!");
}
}
}
if(e.getSource() instanceof JRadioButton){//对单选按钮按下做出反应
if(e.getSource()==radioColors[0]){
color=new Color(255,0,0);
}
if(e.getSource()==radioColors[1]){
color=new Color(0,255,0);
}
if(e.getSource()==radioColors[2]){
color=new Color(0,0,255);
}
text.setForeground(color);
}
if(e.getSource()==comboxSize){
if(!isTrue){//如果不符合要求 不要将字体大小放进字体大小的组合框
isTrue=true;
return ;
}
String size=(String)comboxSize.getSelectedItem();
int i=0,n=comboxSize.getItemCount();
while(i<n&&Integer.parseInt(size)>=Integer.parseInt((String)comboxSize.getItemAt(i))){
if(Integer.parseInt(size)==Integer.parseInt((String)comboxSize.getItemAt(i))){
return ;
}
i++;
}
comboxSize.insertItemAt(size, i);
}
}
}