护目笔记本









#MainFrame
package p1;//0:刚启动1:新建 2: 修改过3:保存过

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.PrintJob;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.print.PageFormat;
import java.awt.print.PrinterJob;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.PrivateKey;
import java.sql.Savepoint;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.naming.spi.DirStateFactory.Result;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.colorchooser.ColorChooserComponentFactory;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.DefaultEditorKit.CopyAction;
import javax.swing.undo.UndoManager;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.omg.CORBA.PUBLIC_MEMBER;

public class MainFrame extends JFrame implements ActionListener{
	private static final long serialVersionUID = 7390199394170L;
	private JPanel contentPane;
	private JTextArea textArea;
	
	private JMenuItem iO;//打开
	private JMenuItem iSave;//保存
	private JMenuItem iSA;//另存为
	private JMenuItem iN;//新建
	private JMenuItem iPe;//页面设置
	private JMenuItem iPt;//打印
	private JMenuItem iExit;//退出
	private JMenuItem iSFH;//查看帮助
	private JMenuItem iAN;//关于记事本
	private JMenuItem iU;//撤销
	private JMenuItem iCut;//剪切
	private JMenuItem iCopy;//复制
	private JMenuItem iPte;//粘贴
	private JMenuItem iD;//删除
	private JMenuItem iFnd;//查找
	private JMenuItem iFN;//查找下一个
	private JMenuItem iR;//替换
	private JMenuItem iT;//跳转
	private JMenuItem iSAll;//全选
	private JMenuItem iTime;//时间
	private JMenuItem iFont;//字体大小
	private JMenuItem iColor;//背景颜色
	private JMenuItem iFC;//字体颜色
	
	private JCheckBoxMenuItem iNL;// 自动换行
	private JCheckBoxMenuItem iS;//设置状态
	
	private JScrollPane scrollPane;

	private JToolBar tS;//字数统计
	
	private JLabel l2;
	private JLabel l3;
	
	private JMenu iEdit;//编辑
	private JMenu iF;//格式
	private JMenu iC;//查看
	private JMenu iH;//帮助
	
	private JSeparator separator;
	
	public static JLabel l1;
	public UndoManager undoMgr = new UndoManager();//撤销管理器
	public Clipboard clipboard = new Clipboard("剪切");//剪切板
	
	int flag = 0;
	int length =0;
	int sum = 0;
	int linenum = 1;//文本行数
	int columnnum = 1;//文本列数
	
	String currentFileName = null;//文件名
	String currentPath = null;//路径
	
	PrintJob p = null;//声明一个要打印对象
	Graphics g = null;//要打印的对象
	
	JColorChooser jcc1 = null;//背景颜色
	Color color = Color.BLACK;
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable(){
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	GregorianCalendar c = new GregorianCalendar();
	int hour = c.get(Calendar.HOUR_OF_DAY);
	int min = c.get(Calendar.MINUTE);
	int second = c.get(Calendar.SECOND);
	private JPopupMenu popupMenu;
	private JMenuItem popM_Undo;//撤销
	private JMenuItem popM_Cut;//剪切
	private JMenuItem popM_Copy;//复制
	private JMenuItem popM_Paste;//粘贴
	private JMenuItem popM_Delete;//删除
	private JMenuItem popM_SelectAll;//全选
	private JMenuItem popM_toLeft;//从左向右阅读
	private JMenuItem popM_showUnicode;//显示Unicode控制字符
	private JMenuItem popM_closeMe;//关闭
	private JMenuItem popM_InsertUnicode;//插入Unicode控制字符
	private JMenuItem popM_RestartSelect;//汉字重选
	private JMenuItem popM_Redo;
	private JSeparator separator_1;
	private JSeparator separator_2;
    private JSeparator separator_3;
    private JSeparator separator_4;
    private JSeparator separator_5;
    private JSeparator separator_6;
    private JSeparator separator_7;
    private JSeparator separator_8;
    private JMenuItem iRedo;

    public MainFrame() {
    	try {
    			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    			} catch (ClassNotFoundException e1) {
    				e1.printStackTrace();
    			} catch (InstantiationException e1) {
    				e1.printStackTrace();
    			} catch (IllegalAccessException e1) {
    				e1.printStackTrace();
    			} catch (UnsupportedLookAndFeelException e1) {
    				e1.printStackTrace();
    			}
    	setTitle("护眼记事本 V2019 1.0版");
    	setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    	setBounds(100, 100, 700, 572);

    	JMenuBar menuBar = new JMenuBar();
    	setJMenuBar(menuBar);
    	
    	JMenu iFile = new JMenu("文件(F)");
    	iFile.setMnemonic('F');
    	menuBar.add(iFile);
    	
    	iN = new JMenuItem("新建(N)",'N');
    	iN.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N,
    			java.awt.Event.CTRL_MASK));
    	iN.addActionListener(this);
    		iFile.add(iN);
    		
    		iO = new JMenuItem("打开(O)",'O');
    		iO.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O,
    						java.awt.Event.CTRL_MASK)); 
    		iO.addActionListener(this);
    		iFile.add(iO);
    			
    		iSave = new JMenuItem("保存(S)");
    		iSave.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,
    					java.awt.Event.CTRL_MASK));
    		iSave.addActionListener(this);
    		iFile.add(iSave);
    			
    		iSA = new JMenuItem("另存为(A)");
    		iSA.addActionListener(this);
    		iFile.add(iSA);
    			
    		separator = new JSeparator();
    		iFile.add(separator);
    			
    		iPe = new JMenuItem("页面设置(U)",'U');
    		iPe.addActionListener(this);
    		iFile.add(iPe);
    			
    		iPt = new JMenuItem("打印(P)",'P');
    		iPt.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P,
    	                java.awt.Event.CTRL_MASK));
    		iPt.addActionListener(this);
    		iFile.add(iPt);
    		
    		separator_1=new JSeparator();
    		iFile.add(separator_1);
    		
    		iExit = new JMenuItem("退出(X)",'X');
    		iExit.addActionListener(this);
    		iFile.add(iExit);
    		
    		iEdit = new JMenu("编辑(E)");
    		iEdit.setMnemonic('E');
    		menuBar.add(iEdit);
    		
    		iU = new JMenuItem("撤销(U)",'U');
            iU.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Z,
                    java.awt.Event.CTRL_MASK));
            iU.addActionListener(this);
            iEdit.add(iU);
            
            iRedo = new JMenuItem("恢复(R)");
            iRedo.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R,
                    java.awt.Event.CTRL_MASK));
            iRedo.addActionListener(this);
            iEdit.add(iRedo);
            
            iCut = new JMenuItem("剪切(T)",'T');
            iCut.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X,
                    java.awt.Event.CTRL_MASK));
            iCut.addActionListener(this);
            
            separator_6 = new JSeparator();
            iEdit.add(separator_6);
            iEdit.add(iCut);
            
            iCopy = new JMenuItem("复制(C)",'C');
            iCopy.addActionListener(this);
            iCopy.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C,
                    java.awt.Event.CTRL_MASK));
            iEdit.add(iCopy);
            
            iPte = new JMenuItem("粘贴(P)",'P');
            iPte.addActionListener(this);
            iPte.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V,
                    java.awt.Event.CTRL_MASK));
            iEdit.add(iPte);
            
            iD = new JMenuItem("删除(L)",'L');
            iD.addActionListener(this);
            iD.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,  
                    InputEvent.CTRL_MASK));  
            iEdit.add(iD);
            
            separator_7 = new JSeparator();
            iEdit.add(separator_7);
            
            iFnd = new JMenuItem("查找(F)",'F');
            iFnd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,
                    Event.CTRL_MASK));
            iFnd.addActionListener(this);
            iEdit.add(iFnd);
            
            iFN = new JMenuItem("查找下一个(N)",'N');
            iFN.setAccelerator(KeyStroke.getKeyStroke("F3"));
            iFN.addActionListener(this);
            iEdit.add(iFN);
            
            iR = new JMenuItem("替换(R)",'R');
            iR.addActionListener(this);
            iR.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,
                    Event.CTRL_MASK));
            iEdit.add(iR);
            
            iT = new JMenuItem("转到(G)",'G');
            iT.addActionListener(this);
            iT.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G,
                    Event.CTRL_MASK));
            iEdit.add(iT);
            
            iSAll = new JMenuItem("全选(A)",'A');
            iSAll.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A,
                    java.awt.Event.CTRL_MASK));
            iSAll.addActionListener(this);
            
            separator_8 = new JSeparator();
            iEdit.add(separator_8);
            iEdit.add(iSAll);
            
            iTime = new JMenuItem("时间/日期(D)",'D');
            iTime.addActionListener(this);
            iTime.setAccelerator(KeyStroke.getKeyStroke("F5"));
            iEdit.add(iTime);
            
            iF = new JMenu("格式(O)");
            iF.setMnemonic('O');
            menuBar.add(iF);
            
            iNL = new JCheckBoxMenuItem("自动换行(W)");
            iNL.addActionListener(this);
            iF.add(iNL);
            
            iFont = new JMenuItem("字体大小(F)...");
            iFont.addActionListener(this);
            iF.add(iFont);
            
            iColor = new JMenuItem("背景颜色(C)...");
            iColor.addActionListener(this);
            iF.add(iColor);
            
            iFC = new JMenuItem("字体颜色(I)...");
            iFC.addActionListener(this);
            iF.add(iFC);
            
            iC = new JMenu("查看(V)");
            iC.setMnemonic('V');
            menuBar.add(iC);
            
            iS = new JCheckBoxMenuItem("状态栏(S)");
            iS.addActionListener(this);
            iC.add(iS);
            
            iH = new JMenu("帮助(H)");
            iH.setMnemonic('H');
            menuBar.add(iH);
            
            iSFH = new JMenuItem("查看帮助(H)",'H');
            iSFH.addActionListener(this);
            iH.add(iSFH);
            
            iAN = new JMenuItem("关于记事本(A)",'A');
            iAN.addActionListener(this);
            iH.add(iAN);
            
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            //设置边框布局
            contentPane.setLayout(new BorderLayout(0, 0));
            setContentPane(contentPane);
            
            textArea = new JTextArea();
            
            //VERTICAL垂直    HORIZONTAL水平
            scrollPane = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            
            //contentPane2=new JPanel();
            //contentPane2.setSize(10,textArea.getSize().height);
            //contentPane.add(contentPane2, BorderLayout.WEST);
            TestLine view = new TestLine();
            scrollPane.setRowHeaderView(view);
            
            popupMenu = new JPopupMenu();
            addPopup(textArea, popupMenu);
            
            popM_Undo = new JMenuItem("撤销(U)");
            popM_Undo.addActionListener(this);
            popupMenu.add(popM_Undo);
            
            popM_Redo = new JMenuItem("恢复(R)");
            popM_Redo.addActionListener(this);
            popupMenu.add(popM_Redo);
            
            separator_2 = new JSeparator();
            popupMenu.add(separator_2);
            
            popM_Cut = new JMenuItem("剪切(T)");
            popM_Cut.addActionListener(this);
            popupMenu.add(popM_Cut);
            
            popM_Copy = new JMenuItem("复制(C)");
            popM_Copy.addActionListener(this);
            popupMenu.add(popM_Copy);
            
            popM_Paste = new JMenuItem("粘贴(P)");
            popM_Paste.addActionListener(this);
            popupMenu.add(popM_Paste);
            
            popM_Delete = new JMenuItem("删除(D)");
            popM_Delete.addActionListener(this);
            popupMenu.add(popM_Delete);
            
            separator_3 = new JSeparator();
            popupMenu.add(separator_3);
            
            popM_SelectAll = new JMenuItem("全选(A)");
            popM_SelectAll.addActionListener(this);
            popupMenu.add(popM_SelectAll);
            
            separator_4 = new JSeparator();
            popupMenu.add(separator_4);
            
            popM_toLeft = new JMenuItem("从右到左的阅读顺序(R)");
            popM_toLeft.addActionListener(this);
            popupMenu.add(popM_toLeft);
            
            popM_showUnicode = new JMenuItem("显示Unicode控制字符(S)");
            popM_showUnicode.addActionListener(this);
            popupMenu.add(popM_showUnicode);
            
            popM_InsertUnicode = new JMenuItem("插入Unicode控制字符(I)");
            popM_InsertUnicode.addActionListener(this);
            popupMenu.add(popM_InsertUnicode);
            
            separator_5 = new JSeparator();
            popupMenu.add(separator_5);
            
            popM_closeMe = new JMenuItem("关闭IME(L)");
            popM_closeMe.addActionListener(this);
            popupMenu.add(popM_closeMe);
            
            popM_RestartSelect = new JMenuItem("汉字重选(R)");
            popM_RestartSelect.addActionListener(this);
            popupMenu.add(popM_RestartSelect);//添加到面板中
            
            contentPane.add(scrollPane, BorderLayout.CENTER);//撤销管理器
            
            textArea.getDocument().addUndoableEditListener(undoMgr);
            
            tS = new JToolBar();
            tS.setSize(textArea.getSize().width,10);
            
            l1=new JLabel("当前系统时间:"+hour+":"+min+":"+second+" ");
            tS.add(l1);
            tS.addSeparator();
            
            l2 = new JLabel("第"+linenum+" 行,第 "+columnnum+"列 ");
            tS.add(l2);
            tS.addSeparator();
            
            l3 = new JLabel("  一共 "+length+" 字 ");
            tS.add(l3);
            textArea.addCaretListener(new CaretListener() {//记录行数和列数
				public void caretUpdate(CaretEvent e) {
					JTextArea editArea = (JTextArea)e.getSource();
					try {
	                    int caretpos = editArea.getCaretPosition();
	                    linenum = editArea.getLineOfOffset(caretpos);
	                    columnnum = caretpos - textArea.getLineStartOffset(linenum);
	                    linenum += 1;
	                    l2.setText("    第 " + linenum + " 行, 第 " + (columnnum+1)+" 列  ");
	                    length=MainFrame.this.textArea.getText().toString().length();
	                    l3.setText("    一共 " +length+" 字  ");
	                }
	                catch(Exception ex) { }
	            }});
            
            contentPane.add(tS, BorderLayout.SOUTH);
            tS.setVisible(true);
            tS.setFloatable(true);
            Clock clock=new Clock();
            clock.start();
            
            
            final JPopupMenu jPopupMenu =new JPopupMenu();//创建弹出式菜单
            textArea.addMouseMotionListener(new MouseAdapter() {
            	@Override
            	public void mouseClicked(MouseEvent e) {
            		if(e.getButton()==MouseEvent.BUTTON3)//只响应鼠标右击
            		{
            			jPopupMenu.show(e.getComponent(),e.getX(),e.getY());
            		}
            	}
            			
			});
            
            isChanged();
            
            this.MainFrameWidowListener();
				}
    private void isChanged() {
    	textArea.addKeyListener(new KeyAdapter() {
    		@Override
    		public void keyTyped(KeyEvent e) {
    			Character c =e.getKeyChar();
    			if(c != null && !textArea.getText().toString().contentEquals("")) {
    				flag = 2;
    			}
    		}
		});
    }
    private void MainFrameWidowListener() {
    	 this.addWindowListener(new WindowAdapter(){
             @Override
             public void windowClosing(WindowEvent e) {
                 if(flag==2 && currentPath==null){
                     //这是弹出小窗口
                     //1、(刚启动记事本为0,刚新建文档为1)条件下修改后
                     int result=JOptionPane.showConfirmDialog(MainFrame.this, "是否保存更改到十组课设", "记事本", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                     if(result==JOptionPane.OK_OPTION){
                         MainFrame.this.saveAs();
                     }else if(result==JOptionPane.NO_OPTION){
                         MainFrame.this.dispose();
                         MainFrame.this.setDefaultCloseOperation(EXIT_ON_CLOSE);
                     }
                 }else if(flag==2 && currentPath!=null){
                     //弹出窗口
                     //1、(刚启动记事本为0,刚新建文档为1)条件下修改后
                     int result=JOptionPane.showConfirmDialog(MainFrame.this, "是否将更改保存到十组课设"+currentPath+"?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                     if(result==JOptionPane.OK_OPTION){
                         MainFrame.this.save();
                     }else if(result==JOptionPane.NO_OPTION){
                         MainFrame.this.dispose();
                         MainFrame.this.setDefaultCloseOperation(EXIT_ON_CLOSE);
                     }
                 }else{
                     //弹出窗口
                     int result=JOptionPane.showConfirmDialog(MainFrame.this, "确定关闭", "系统提示", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);
                     if(result==JOptionPane.OK_OPTION){
                         MainFrame.this.dispose();
                         MainFrame.this.setDefaultCloseOperation(EXIT_ON_CLOSE);
                     }
                 }
             }
         });
     }
    public void actionPerformed(ActionEvent e) {
    	// TODO Auto-generated method stub
    	if(e.getSource()==iO){//打开
    		openFile();
    	}else if(e.getSource()==iS) {//保存
    		save();
    	}else if(e.getSource()==iSA) {//另存为
    		saveAs();
    	}else if(e.getSource()==iN) {//新建
    		newFile();
    	}else if(e.getSource()==iExit) {//退出
    		exit();
    	}else if(e.getSource()==iPe) {//页面设置
    		PageFormat pFormat = new PageFormat();
    		PrinterJob.getPrinterJob().pageDialog(pFormat);}
    	else if(e.getSource()==iPt) {//打印
    		Print();
    	}else if(e.getSource()==iU ||e.getSource() == popM_Undo){//撤销
    		if(undoMgr.canRedo()) {
    			undoMgr.canRedo();
    		}
    	}else if(e.getSource() == iCut || e.getSource() == popM_Cut) {//复制
    		cut();
    	}else if(e.getSource()==iPe || e.getSource()==popM_Copy) {//粘贴
    		paste();
    	}else if(e.getSource()==iD || e.getSource()==popM_Delete) {//删除
    		String temString = textArea.getText().toString();
    		textArea.setText(temString.substring(0,textArea.getSelectionStart()));
    	}else if(e.getSource()==iFnd) {//查找
    		mySearch();
    	}else if(e.getSource()==iFN) {//查找下一个
    		mySearch();
    	}else if(e.getSource()==iR) {//替换
    		mySearch();
    	}else if(e.getSource()==iSA || e.getSource()==popM_SelectAll) {//全选
    		textArea.selectAll();
    	}else if(e.getSource()==iT) {//时间
    		textArea.append(hour+":"+min+":"+c.get(Calendar.YEAR)+"/"+(c.get(Calendar.MONTH)+1)+"/"+c.get(Calendar.DAY_OF_MONTH));
    	}else if(e.getSource()==iNL) {//自动换行
    		if(iNL.isSelected()) {
    			textArea.setLineWrap(true);
    		}else {
    			textArea.setLineWrap(false);
    		}
    	}else if(e.getSource()==iFont) {//字体大小
    		MQFontChooser fontChooser = new MQFontChooser(textArea.getFont());//字体选择器
    		fontChooser.showFontDialog(this);
    		Font font = fontChooser.getSelectFont();
    		textArea.setFont(font);//将字体设置到图形界面
    	}else if(e.getSource()==iColor) {//背景颜色
    		jcc1=new JColorChooser();
    		JOptionPane.showMessageDialog(this, jcc1,"选择背景颜色",-1);
    		color = jcc1.getColor();
    		textArea.setBackground(color);
    	}else if(e.getSource()==iFC) {//字体颜色
    		color = jcc1.getColor();
    		JOptionPane.showMessageDialog(this, jcc1,"选择字体颜色",-1);
    		color = jcc1.getColor();
    		textArea.setForeground(color);
    	}else if(e.getSource()==iS) {//状态
    		if(iS.isSelected()) {
    			tS.setVisible(true);
    		}else {
    			tS.setVisible(false);
    		}
    	}else if(e.getSource()==iSFH) {
    		JOptionPane.showMessageDialog(this, "打开浏览器,百度搜索","帮助",1);
    	}else if(e.getSource()==iAN) {
    		JOptionPane.showMessageDialog(this, "记事本 V2019【网络十组制作】","软件说明",1);
    	}
    }
    private void turnTo() {
    	final JDialog gotoDialog = new JDialog(this, "转到下列行");
        JLabel gotoLabel= new JLabel("行数(L):");
        final JTextField linenum = new JTextField(5);
        linenum.setText("1");
        linenum.selectAll();

    	JButton okButton = new JButton("确定");
    	 okButton.addActionListener(new ActionListener() {
    		 
             public void actionPerformed(ActionEvent e) {
                 int totalLine = textArea.getLineCount();
                 int[] lineNumber = new int[totalLine + 1];
                 String s = textArea.getText();
                 int pos = 0, t = 0;
  
                 while (true) {
                     pos = s.indexOf('\12', pos);
                     // System.out.println("引索pos:"+pos);
                     if (pos == -1)
                         break;
                     lineNumber[t++] = pos++;
                 }
  
                 int gt = 1;
                 try {
                     gt = Integer.parseInt(linenum.getText());
                 } catch (NumberFormatException efe) {
                     JOptionPane.showMessageDialog(null, "请输入行数!", "提示", JOptionPane.WARNING_MESSAGE);
                     linenum.requestFocus(true);
                     return;
                 }
  
                 if (gt < 2 || gt >= totalLine) {
                     if (gt < 2)
                         textArea.setCaretPosition(0);
                     else
                         textArea.setCaretPosition(s.length());
                 } else
                     textArea.setCaretPosition(lineNumber[gt - 2] + 1);
  
                 gotoDialog.dispose();
             }
  
         });
  
         JButton cancelButton = new JButton("取消");
         cancelButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 gotoDialog.dispose();
             }
         });
  
         Container con = gotoDialog.getContentPane();
         con.setLayout(new FlowLayout());
         con.add(gotoLabel);
         con.add(linenum);
         con.add(okButton);
         con.add(cancelButton);
  
         gotoDialog.setSize(200, 100);
         gotoDialog.setResizable(true);
         gotoDialog.setLocation(300, 280);
         gotoDialog.setVisible(true);

     }
    private void exit() {
    	
    	if(flag==2&& currentPath==null) {
    		int result = JOptionPane.showConfirmDialog(MainFrame.this,"是否更改保存到十组课设?","记事本" ,JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
    		if(result == JOptionPane.OK_CANCEL_OPTION) {
    			MainFrame.this.saveAs();
    		}else if(result ==JOptionPane.NO_OPTION) {
    			MainFrame.this.dispose();
    			MainFrame.this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		}
    	}else {
    			int result =JOptionPane.showConfirmDialog(MainFrame.this, "确定关闭?","系统提示",JOptionPane.YES_NO_OPTION,JOptionPane.PLAIN_MESSAGE);
    			if(result == JOptionPane.OK_OPTION) {
    				MainFrame.this.dispose();
    				MainFrame.this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    			}
    		}
    	}
    
    	private void newFile() {
    		if(flag ==0 || flag ==1) {
    			return;
    		}else if(flag ==2 && this.currentPath ==null) {//修改后
    			int result = JOptionPane.showConfirmDialog(MainFrame.this, "是否更改保存到十组课设?","记事本",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
    			if(result == JOptionPane.OK_OPTION) {
    				this.saveAs();//另存为
    			}else if(result == JOptionPane.NO_OPTION) {
    				this.textArea.setText("十组课设");
    				flag=1;
    			}
    			return;
    		}else if(flag == 2 && this.currentPath != null) {
    			int result = JOptionPane.showConfirmDialog(MainFrame.this,"是否更改保存到"+this.currentPath+"?","记事本",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE );
    			if(result == JOptionPane.OK_CANCEL_OPTION) {
    				this.textArea.setText("");
    				this.setTitle("十组课设");
    				flag = 1;
    			}
    		}else if(flag == 3) {//保存的文件
    			this.textArea.setText("十组课设");
    		}
    	}
    	
    	private void saveAs() {//打开保存框
			JFileChooser chooser = new JFileChooser();//选择文件
			int result = chooser.showSaveDialog(this);
			if(result == JFileChooser.APPROVE_OPTION) {//生成的文件
				File file = chooser.getSelectedFile();
				FileWriter fileWriter = null;
				//保存
				try {
	                fileWriter=new FileWriter(file);
	                fileWriter.write(textArea.getText());
	                currentFileName=file.getName();
	                currentPath=file.getAbsolutePath();
	                fileWriter.flush();
	                this.flag=3;
	                this.setTitle(currentPath);
	            } catch (IOException e1) {
	                e1.printStackTrace();
	            }finally{
	                try {
	                    if(fileWriter!=null) fileWriter.close();
	                } catch (IOException e1) {
	                    e1.printStackTrace();
	                }
	            }
			}	
		}
    	 private void save()
    	 {
    	        if(this.currentPath==null)
    	        {
    	            this.saveAs();
    	            if(this.currentPath==null)
    	            {
    	                return;
    	            }
    	        }
    	        FileWriter fileWriter=null;
    	        //保存
    	        try 
    	        {
    	            fileWriter=new FileWriter(new  File(currentPath));
    	            fileWriter.write(textArea.getText());
    	            fileWriter.flush();
    	            flag=3;
    	            this.setTitle(this.currentPath);
    	        } catch (IOException e1) 
    	        {
    	            e1.printStackTrace();
    	        }finally
    	        {
    	            try 
    	            {
    	                if(fileWriter!=null) fileWriter.close();
    	            } catch (IOException e1) 
    	            {
    	                e1.printStackTrace();
    	            }
    	        }
    	 }
    	 private void openFile() {
    		 if(flag == 2 && this.currentPath == null) {
    			 int result = JOptionPane.showConfirmDialog(MainFrame.this, "是否更改保存到十组课设?","记事本",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
    			 if(result == JOptionPane.OK_CANCEL_OPTION) {
    				 this.saveAs();
    			 }
    		 }else if(flag == 2 && this.currentPath !=null) {
    			 int result = JOptionPane.showConfirmDialog(MainFrame.this,"是否保存更改到"+this.currentPath+"?","记事本",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
    			 if(result == JOptionPane.OK_CANCEL_OPTION) {
    				 this.save();
    			 }
    		 }
    		 JFileChooser chooser = new JFileChooser();//选择文件
    		 int result = chooser.showOpenDialog(this);
    		 if(result == JFileChooser.APPROVE_OPTION) {//获得选取的文件
    			 File file = chooser.getSelectedFile();//打开已经保存过的文件,并提前保存文件名
    			 currentFileName = file.getAbsolutePath();
    			 flag = 3;
    			 this.setTitle(this.currentPath);
    			 BufferedReader bReader =null;
    			 try {
    	                //建立文件流(字符流)
    	                InputStreamReader isr=new InputStreamReader(new FileInputStream(file),"GBK");
    	                bReader=new BufferedReader(isr);//动态绑定
    	                //读取内容
    	                StringBuffer sb=new StringBuffer();
    	                String line=null;
    	                while((line=bReader.readLine())!=null){
    	                    sb.append(line+SystemParam.LINE_SEPARATOR);
    	                }
    	                //显示在文本框(多框)
    	                textArea.setText(sb.toString());
    	            } catch (FileNotFoundException e1) {
    	                e1.printStackTrace();
    	            } catch (IOException e1) {
    	                e1.printStackTrace();
    	            } finally{
    	                try {
    	                    if(bReader!=null) bReader.close();
    	                } catch (Exception e1) {
    	                    e1.printStackTrace();
    	                }
    	            }
    		 }
    	 }
    	 public void Print() {
    		 try{
    	            p = getToolkit().getPrintJob(this,"ok",null);
    	            g = p.getGraphics();//p 获取一个用于打印的 Graphics 的对象
    	            this.textArea.printAll(g);
    	            p.end();//释放对象 g  
    	        }
    		 catch(Exception a){
    			 
    	        } 
    	    }
    	    
    	    
    	    private static void addPopup(Component component, final JPopupMenu popup) {
    	        component.addMouseListener(new MouseAdapter() {
    	            public void mousePressed(MouseEvent e) {
    	                if (e.isPopupTrigger()) {
    	                    showMenu(e);
    	                }
    	            }
    	            public void mouseReleased(MouseEvent e) {
    	                if (e.isPopupTrigger()) {
    	                    showMenu(e);
    	                }
    	            }
    	            private void showMenu(MouseEvent e) {
    	                popup.show(e.getComponent(), e.getX(), e.getY());
    	            }
    	        });
    	    }
    	    
    	    public void cut(){
    	        copy();
    	        //标记开始位置
    	        int start = this.textArea.getSelectionStart();
    	        //标记结束位置
    	        int end = this.textArea.getSelectionEnd();
    	        //删除所选段
    	        this.textArea.replaceRange("", start, end);
    	        
    	    }
    	    
    	    public void copy(){
    	        //拖动选取文本
    	        String temp = this.textArea.getSelectedText();
    	        //把获取的内容复制到连续字符器,这个类继承了剪贴板接口
    	        StringSelection text = new StringSelection(temp);
    	        //把内容放在剪贴板
    	        this.clipboard.setContents(text, null);
    	    }
    	    
    	     public void paste(){
    	         //Transferable接口,把剪贴板的内容转换成数据
    	         Transferable contents = this.clipboard.getContents(this);
    	         //DataFalvor类判断是否能把剪贴板的内容转换成所需数据类型
    	         DataFlavor flavor = DataFlavor.stringFlavor;
    	         //如果可以转换
    	         if(contents.isDataFlavorSupported(flavor)){
    	             String str;
    	             try {//开始转换
    	                str=(String)contents.getTransferData(flavor);
    	                //如果要粘贴时,鼠标已经选中了一些字符
    	                if(this.textArea.getSelectedText()!=null){
    	                    //定位被选中字符的开始位置
    	                    int start = this.textArea.getSelectionStart();
    	                    //定位被选中字符的末尾位置
    	                    int end = this.textArea.getSelectionEnd();
    	                    //把粘贴的内容替换成被选中的内容
    	                    this.textArea.replaceRange(str, start, end);
    	                }else{
    	                    //获取鼠标所在TextArea的位置
    	                    int mouse = this.textArea.getCaretPosition();
    	                    //在鼠标所在的位置粘贴内容
    	                    this.textArea.insert(str, mouse);
    	                }
    	             } catch(UnsupportedFlavorException e) {
    	                e.printStackTrace();
    	             } catch (IOException e) {
    	                e.printStackTrace();
    	             } catch(IllegalArgumentException e){
    	                e.printStackTrace();
    	             }
    	         }
    	     }
    	     
    	    public void mySearch() {
    	        final JDialog findDialog = new JDialog(this, "查找与替换", true);
    	        Container con = findDialog.getContentPane();
    	        con.setLayout(new FlowLayout(FlowLayout.LEFT));
    	        JLabel searchContentLabel = new JLabel("查找内容(N) :");
    	        JLabel replaceContentLabel = new JLabel("替换为(P)  :");
    	        final JTextField findText = new JTextField(22);
    	        final JTextField replaceText = new JTextField(22);
    	        final JCheckBox matchcase = new JCheckBox("区分大小写");
    	        ButtonGroup bGroup = new ButtonGroup();
    	        final JRadioButton up = new JRadioButton("向上(U)");
    	        final JRadioButton down = new JRadioButton("向下(D)");
    	        down.setSelected(true);
    	        bGroup.add(up);
    	        bGroup.add(down);
    	        JButton searchNext = new JButton("查找下一个(F)");
    	        JButton replace = new JButton("替换(R)");
    	        final JButton replaceAll = new JButton("全部替换(A)");
    	        searchNext.setPreferredSize(new Dimension(110, 22));
    	        replace.setPreferredSize(new Dimension(110, 22));
    	        replaceAll.setPreferredSize(new Dimension(110, 22));
    	        // "替换"按钮的事件处理
    	        replace.addActionListener(new ActionListener() {
    	            public void actionPerformed(ActionEvent e) {
    	 
    	                if (replaceText.getText().length() == 0 && textArea.getSelectedText() != null)
    	                    textArea.replaceSelection("");
    	                if (replaceText.getText().length() > 0 && textArea.getSelectedText() != null)
    	                    textArea.replaceSelection(replaceText.getText());
    	            }
    	        });
    	 
    	        // "替换全部"按钮的事件处理
    	        replaceAll.addActionListener(new ActionListener() {
    	            public void actionPerformed(ActionEvent e) {
    	 
    	                textArea.setCaretPosition(0); // 将光标放到编辑区开头
    	                int a = 0, b = 0, replaceCount = 0;
    	 
    	                if (findText.getText().length() == 0) {
    	                    JOptionPane.showMessageDialog(findDialog, "请填写查找内容!", "提示", JOptionPane.WARNING_MESSAGE);
    	                    findText.requestFocus(true);
    	                    return;
    	                }
    	                while (a > -1) {
    	 
    	                    int FindStartPos = textArea.getCaretPosition();
    	                    String str1, str2, str3, str4, strA, strB;
    	                    str1 = textArea.getText();
    	                    str2 = str1.toLowerCase();
    	                    str3 = findText.getText();
    	                    str4 = str3.toLowerCase();
    	 
    	                    if (matchcase.isSelected()) {
    	                        strA = str1;
    	                        strB = str3;
    	                    } else {
    	                        strA = str2;
    	                        strB = str4;
    	                    }
    	 
    	                    if (up.isSelected()) {
    	                        if (textArea.getSelectedText() == null) {
    	                            a = strA.lastIndexOf(strB, FindStartPos - 1);
    	                        } else {
    	                            a = strA.lastIndexOf(strB, FindStartPos - findText.getText().length() - 1);
    	                        }
    	                    } else if (down.isSelected()) {
    	                        if (textArea.getSelectedText() == null) {
    	                            a = strA.indexOf(strB, FindStartPos);
    	                        } else {
    	                            a = strA.indexOf(strB, FindStartPos - findText.getText().length() + 1);
    	                        }
    	 
    	                    }
    	 
    	                    if (a > -1) {
    	                        if (up.isSelected()) {
    	                            textArea.setCaretPosition(a);
    	                            b = findText.getText().length();
    	                            textArea.select(a, a + b);
    	                        } else if (down.isSelected()) {
    	                            textArea.setCaretPosition(a);
    	                            b = findText.getText().length();
    	                            textArea.select(a, a + b);
    	                        }
    	                    } else {
    	                        if (replaceCount == 0) {
    	                            JOptionPane.showMessageDialog(findDialog, "找不到您查找的内容!", "记事本", JOptionPane.INFORMATION_MESSAGE);
    	                        } else {
    	                            JOptionPane.showMessageDialog(findDialog, "成功替换" + replaceCount + "个匹配内容!", "替换成功", JOptionPane.INFORMATION_MESSAGE);
    	                        }
    	                    }
    	                    if (replaceText.getText().length() == 0 && textArea.getSelectedText() != null) {
    	                        textArea.replaceSelection("");
    	                        replaceCount++;
    	                    }
    	                    if (replaceText.getText().length() > 0 && textArea.getSelectedText() != null) {
    	                        textArea.replaceSelection(replaceText.getText());
    	                        replaceCount++;
    	                    }
    	                }// end while
    	            }
    	        }); /* "替换全部"按钮的事件处理结束 */
    	 
    	        // "查找下一个"按钮事件处理
    	        searchNext.addActionListener(new ActionListener() {
    	 
    	            public void actionPerformed(ActionEvent e) {
    	                int a = 0, b = 0;
    	                int FindStartPos = textArea.getCaretPosition();
    	                String str1, str2, str3, str4, strA, strB;
    	                str1 = textArea.getText();
    	                str2 = str1.toLowerCase();
    	                str3 = findText.getText();
    	                str4 = str3.toLowerCase();
    	                // "区分大小写"的CheckBox被选中
    	                if (matchcase.isSelected()) {
    	                    strA = str1;
    	                    strB = str3;
    	                } else {
    	                    strA = str2;
    	                    strB = str4;
    	                }
    	 
    	                if (up.isSelected()) {
    	                    if (textArea.getSelectedText() == null) {
    	                        a = strA.lastIndexOf(strB, FindStartPos - 1);
    	                    } else {
    	                        a = strA.lastIndexOf(strB, FindStartPos - findText.getText().length() - 1);
    	                    }
    	                } else if (down.isSelected()) {
    	                    if (textArea.getSelectedText() == null) {
    	                        a = strA.indexOf(strB, FindStartPos);
    	                    } else {
    	                        a = strA.indexOf(strB, FindStartPos - findText.getText().length() + 1);
    	                    }
    	 
    	                }
    	                if (a > -1) {
    	                    if (up.isSelected()) {
    	                        textArea.setCaretPosition(a);
    	                        b = findText.getText().length();
    	                        textArea.select(a, a + b);
    	                    } else if (down.isSelected()) {
    	                        textArea.setCaretPosition(a);
    	                        b = findText.getText().length();
    	                        textArea.select(a, a + b);
    	                    }
    	                } else {
    	                    JOptionPane.showMessageDialog(null, "找不到您查找的内容!", "记事本", JOptionPane.INFORMATION_MESSAGE);
    	                }
    	 
    	            }
    	        });/* "查找下一个"按钮事件处理结束 */
    	        // "取消"按钮及事件处理
    	        JButton cancel = new JButton("取消");
    	        cancel.setPreferredSize(new Dimension(110, 22));
    	        cancel.addActionListener(new ActionListener() {
    	            public void actionPerformed(ActionEvent e) {
    	                findDialog.dispose();
    	            }
    	        });
    	 
    	        // 创建"查找与替换"对话框的界面
    	        JPanel bottomPanel = new JPanel();
    	        JPanel centerPanel = new JPanel();
    	        JPanel topPanel = new JPanel();
    	 
    	        JPanel direction = new JPanel();
    	        direction.setBorder(BorderFactory.createTitledBorder("方向 "));
    	        direction.add(up);
    	        direction.add(down);
    	        direction.setPreferredSize(new Dimension(170, 60));
    	        JPanel replacePanel = new JPanel();
    	        replacePanel.setLayout(new GridLayout(2, 1));
    	        replacePanel.add(replace);
    	        replacePanel.add(replaceAll);
    	 
    	        topPanel.add(searchContentLabel);
    	        topPanel.add(findText);
    	        topPanel.add(searchNext);
    	        centerPanel.add(replaceContentLabel);
    	        centerPanel.add(replaceText);
    	        centerPanel.add(replacePanel);
    	        bottomPanel.add(matchcase);
    	        bottomPanel.add(direction);
    	        bottomPanel.add(cancel);
    	 
    	        con.add(topPanel);
    	        con.add(centerPanel);
    	        con.add(bottomPanel);
    	 
    	        // 设置"查找与替换"对话框的大小、可更改大小(否)、位置和可见性
    	        findDialog.setSize(410, 210);
    	        findDialog.setResizable(true);
    	        findDialog.setLocation(230, 280);
    	        findDialog.setVisible(true);
    	    }
    	 
    	}
#MQFontChooser
package p1;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.print.attribute.AttributeSet;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

public class MQFontChooser extends JDialog{
	public static final double CANCEL_OPTION = 0;//选择取消按钮的返回值
	public static final double APPROVE_OPTION = 1;//选择确定按钮的返回值
	private static final String CHINA_STRING = " 请输入文字 ";//中文预览的字符串
	private static final String ENGLISH_STRING =" write down please ";//英文预览字符串
	private static final String NUMBER_STRING = " 1234 ";//数字预览的字符串
	private Font font = null;//预设字体
	private Box box =null;//字体选择器组件容器
	private JTextField fontText = null;//字体样式文本框
	private JTextField styleText = null;//样式文本框
	private JTextField sizeText = null;//文字大小文本框
	private JTextField previewText = null;//预览文本框
	private JRadioButton chinaButton = null;//中文预览
	private JRadioButton englishButton = null;//英文预览
	private JRadioButton numberButton = null;//数字预览
	private JList fontList = null;//字体选择框
	private JList styleList = null;//样式选择框
	private JList sizeList = null;//文字大小选择框
	private JButton approveButton = null;//确定按钮
	private JButton cancelButton = null;//取消字体
	private String [] fontArray = null;//所有字体
	private String [] styleArray = {"常规","加粗","斜体","斜体加粗"};//预设样式
	private String [] sizeArray = {"初号","小初","一号","小一","二号","小二","三号","小三","四号","小四","五号","小五","六号","小六","七号","八号","5","5.5","6.5","7.5","8","9","10","10.5","11","12","14","16","18","20","22","24","26","28","36","48","72"};//字体大小
	private double [] sizeintArray = {42,36,26,24,22,18,16,15,14,12,10,9,8,7,6,5,5,5.5,6.5,7.5,8,9,10,10.5,11,12,14,16,18,20,22,24,26,28,36,48,72};//对应上面数组中的字体大小
	private double returnValue = CANCEL_OPTION;//构造字体选择器
	public MQFontChooser() {
		this(new Font("宋体",Font.PLAIN,12));
	}
	public MQFontChooser(Font font) {
		setTitle("文字选择器");
		this.font = font;
		init();//初始化UI组件
		addListener();//添加监听器
		setup();//按照预设字体显示
		setModal(true);//基本设置
		setResizable(false);//自动适应大小
		pack();
	}
	private void init() {
		GraphicsEnvironment eqEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();//获得系统字体
		fontArray = eqEnvironment.getAvailableFontFamilyNames();
		box = Box.createVerticalBox();//主容器
		box = Box.createVerticalBox();
		box.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
		fontText = new JTextField();
		fontText.setEditable(false);
		fontText.setBackground(Color.WHITE);
		styleText = new JTextField();
		styleText.setEditable(false);
		styleText.setBackground(Color.WHITE);
		sizeText = new JTextField("12");
		// 给文字大小文本框使用的Document文档,制定了一些输入字符的规则
		Document doc = new PlainDocument(){
			public void insertString(int offs, String str, javax.swing.text.AttributeSet a) throws BadLocationException {
				if (str == null) {
					return;
				}
				if (getLength() >= 3) {
					return;
				}
				if (!str.matches("[0-9]+") && !str.equals("初号") && !str.equals("小初") && !str.equals("一号") && !str.equals("小一") && !str.equals("二号") && !str.equals("小二") && !str.equals("三号") && !str.equals("小三") && !str.equals("四号") && !str.equals("小四") && !str.equals("五号") && !str.equals("小五") && !str.equals("六号") && !str.equals("小六") && !str.equals("七号") && !str.equals("八号")) {
					return;
				}
				super.insertString(offs, str, a);
				sizeList.setSelectedValue(sizeText.getText(), true);
			}
		};

		sizeText.setDocument(doc);
		previewText = new JTextField(20);
		previewText.setHorizontalAlignment(JTextField.CENTER);
		previewText.setEditable(false);
		previewText.setBackground(Color.WHITE);
		chinaButton = new JRadioButton("中文预览", true);
		englishButton = new JRadioButton("英文预览");
		numberButton = new JRadioButton("数字预览");
		ButtonGroup bg = new ButtonGroup();
		bg.add(chinaButton);
		bg.add(englishButton);
		bg.add(numberButton);
		fontList = new JList(fontArray);
		styleList = new JList(styleArray);
		sizeList = new JList(sizeArray);
		approveButton = new JButton("确定");
		cancelButton = new JButton("取消");
		Box box1 = Box.createHorizontalBox();
		JLabel l1 = new JLabel("字体:");
		JLabel l2 = new JLabel("字形:");
		JLabel l3 = new JLabel("大小:");
		l1.setPreferredSize(new Dimension(165, 14));
		l1.setMaximumSize(new Dimension(165, 14));
		l1.setMinimumSize(new Dimension(165, 14));
		l2.setPreferredSize(new Dimension(95, 14));
		l2.setMaximumSize(new Dimension(95, 14));
		l2.setMinimumSize(new Dimension(95, 14));
		l3.setPreferredSize(new Dimension(80, 14));
		l3.setMaximumSize(new Dimension(80, 14));
		l3.setMinimumSize(new Dimension(80, 14));
		box1.add(l1);
		box1.add(l2);
		box1.add(l3);
		Box box2 = Box.createHorizontalBox();
		fontText.setPreferredSize(new Dimension(160, 20));
		fontText.setMaximumSize(new Dimension(160, 20));
		fontText.setMinimumSize(new Dimension(160, 20));
		box2.add(fontText);
		box2.add(Box.createHorizontalStrut(5));
		styleText.setPreferredSize(new Dimension(90, 20));
		styleText.setMaximumSize(new Dimension(90, 20));
		styleText.setMinimumSize(new Dimension(90, 20));
		box2.add(styleText);
		box2.add(Box.createHorizontalStrut(5));
		sizeText.setPreferredSize(new Dimension(80, 20));
		sizeText.setMaximumSize(new Dimension(80, 20));
		sizeText.setMinimumSize(new Dimension(80, 20));
		box2.add(sizeText);
		Box box3 = Box.createHorizontalBox();
		JScrollPane sp1 = new JScrollPane(fontList);
		sp1.setPreferredSize(new Dimension(160, 100));
		sp1.setMaximumSize(new Dimension(160, 100));
		sp1.setMaximumSize(new Dimension(160, 100));
		box3.add(sp1);
		box3.add(Box.createHorizontalStrut(5));
		JScrollPane sp2 = new JScrollPane(styleList);
		sp2.setPreferredSize(new Dimension(90, 100));
		sp2.setMaximumSize(new Dimension(90, 100));
		sp2.setMinimumSize(new Dimension(90, 100));
		box3.add(sp2);
		box3.add(Box.createHorizontalStrut(5));
		JScrollPane sp3 = new JScrollPane(sizeList);
		sp3.setPreferredSize(new Dimension(80, 100));
		sp3.setMaximumSize(new Dimension(80, 100));
		sp3.setMinimumSize(new Dimension(80, 100));
		box3.add(sp3);
		Box box4 = Box.createHorizontalBox();
		Box box5 = Box.createVerticalBox();
		JPanel box6 = new JPanel(new BorderLayout());
		box5.setBorder(BorderFactory.createTitledBorder("字符集"));
		box6.setBorder(BorderFactory.createTitledBorder("示例"));
		box5.add(chinaButton);
		box5.add(englishButton);
		box5.add(numberButton);
		box5.setPreferredSize(new Dimension(90, 95));
		box5.setMaximumSize(new Dimension(90, 95));
		box5.setMinimumSize(new Dimension(90, 95));
		box6.add(previewText);
		box6.setPreferredSize(new Dimension(250, 95));
		box6.setMaximumSize(new Dimension(250, 95));
		box6.setMinimumSize(new Dimension(250, 95));
		box4.add(box5);
		box4.add(Box.createHorizontalStrut(4));
		box4.add(box6);
		Box box7 = Box.createHorizontalBox();
		box7.add(Box.createHorizontalGlue());
		box7.add(approveButton);
		box7.add(Box.createHorizontalStrut(5));
		box7.add(cancelButton);
		box.add(box1);
		box.add(box2);
		box.add(box3);
		box.add(Box.createVerticalStrut(5));
		box.add(box4);
		box.add(Box.createVerticalStrut(5));
		box.add(box7);
		getContentPane().add(box);
	}
	/**
	 * 按照预设字体显示
	 */
	private void setup() {
		String fontName = font.getFamily();
		int fontStyle = font.getStyle();
		int fontSize = font.getSize();
		/*
		 * 如果预设的文字大小在选择列表中,则通过选择该列表中的某项进行设值,否则直接将预设文字大小写入文本框
		 */
		boolean b = false;
		for (int i = 0; i < sizeArray.length; i++) {
			if (sizeArray[i].equals(String.valueOf(fontSize))) {
				b = true;
				break;
			}
		}
		if(b){
			// 选择文字大小列表中的某项
			sizeList.setSelectedValue(String.valueOf(fontSize), true);
		}else{
			sizeText.setText(String.valueOf(fontSize));
		}
		// 选择字体列表中的某项
		fontList.setSelectedValue(fontName, true);
		// 选择样式列表中的某项
		styleList.setSelectedIndex(fontStyle);
		// 预览默认显示中文字符
		chinaButton.doClick();
		// 显示预览
		setPreview();
	}
	/**
	 * 添加所需的事件监听器
	 */
	private void addListener() {
		sizeText.addFocusListener(new FocusListener() {
			public void focusLost(FocusEvent e) {
				setPreview();
			}
			public void focusGained(FocusEvent e) {
				sizeText.selectAll();
			}
		});
		// 字体列表发生选择事件的监听器
		fontList.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if (!e.getValueIsAdjusting()) {
					fontText.setText(String.valueOf(fontList.getSelectedValue()));
					// 设置预览
					setPreview();
				}
			}
		});
		styleList.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if (!e.getValueIsAdjusting()) {
					styleText.setText(String.valueOf(styleList.getSelectedValue()));
					// 设置预览
					setPreview();
				}
			}
		});
		sizeList.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if (!e.getValueIsAdjusting()) {
					if(!sizeText.isFocusOwner()){
						sizeText.setText(String.valueOf(sizeList.getSelectedValue()));
					}
					// 设置预览
					setPreview();
				}
			}
		});
		// 编码监听器
		EncodeAction ea = new EncodeAction();
		chinaButton.addActionListener(ea);
		englishButton.addActionListener(ea);
		numberButton.addActionListener(ea);
		// 确定按钮的事件监听
		approveButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 组合字体
				font = groupFont();
				// 设置返回值
				returnValue = APPROVE_OPTION;
				// 关闭窗口
				disposeDialog();
			}
		});
		// 取消按钮事件监听
		cancelButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				disposeDialog();
			}
		});
	}
	/**
	 * 显示字体选择器
	 * @param owner 上层所有者
	 * @return 该整形返回值表示用户点击了字体选择器的确定按钮或取消按钮,参考本类常量字段APPROVE_OPTION和CANCEL_OPTION
	 */
	public final double showFontDialog(JFrame owner) {
		setLocationRelativeTo(owner);
		setVisible(true);
		return returnValue;
	}
	/**
	 * 返回选择的字体对象
	 * @return 字体对象
	 */
	public final Font getSelectFont() {
		return font;
	}
	/**
	 * 关闭窗口
	 */
	private void disposeDialog() {
		MQFontChooser.this.removeAll();
		MQFontChooser.this.dispose();
	}
	
	/**
	 * 显示错误消息
	 * @param errorMessage 错误消息
	 */
	private void showErrorDialog(String errorMessage) {
		JOptionPane.showMessageDialog(this, errorMessage, "错误", JOptionPane.ERROR_MESSAGE);
	}
	/**
	 * 设置预览
	 */
	private void setPreview() {
		Font f = groupFont();
		previewText.setFont(f);
	}
	/**
	 * 按照选择组合字体
	 * @return 字体
	 */
	private Font groupFont() {
		String fontName = fontText.getText();
		double fontStyle = styleList.getSelectedIndex();
		String sizeStr = sizeText.getText().trim();
		// 如果没有输入
		if(sizeStr.length() == 0) {
			showErrorDialog("字体(大小)必须是有效“数值!");
			return null;
		}
		double fontSize = 0;
		// 通过循环对比文字大小输入是否在现有列表内
		for (int i = 0; i < sizeArray.length; i++) {
			if(sizeStr.equals(sizeArray[i])){
				fontSize = sizeintArray[i];
				break;
			}
		}
		// 没有在列表内
		if (fontSize == 0) {
			try{
				fontSize = Integer.parseInt(sizeStr);
				if(fontSize < 1){
					showErrorDialog("字体(大小)必须是有效“数值”!");
					return null;
				}
			}catch (NumberFormatException nfe) {
				showErrorDialog("字体(大小)必须是有效“数值”!");
				return null;
			}
		}
		return new Font(font.getFamily(),font.getStyle(),font.getSize());
	}
	
	/**
	 * 编码选择事件的监听动作
	 *
	 */
	class EncodeAction implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (e.getSource().equals(chinaButton)) {
				previewText.setText(CHINA_STRING);
			} else if (e.getSource().equals(englishButton)) {
				previewText.setText(ENGLISH_STRING);
			} else {
				previewText.setText(NUMBER_STRING);
			}
		}
	}
}
#SystemParam
package p1;

public class SystemParam{
	public static final String LINE_SEPARATOR = System.getProperty("line.separator");
}
#TestLine
package p1;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class TestLine extends javax.swing.JComponent{
	private final  Font DEFAULT_FONT = new Font(Font.MONOSPACED, Font.PLAIN, 13);
	public final Color DEFAULT_BACKGROUD = new Color(228,228,228);
    public final Color DEFAULT_FOREGROUD = Color.red;
    public final int nHEIGHT = Integer.MAX_VALUE - 1000000;
    public final int MARGIN = 5;
    private int lineHeight;
    private int fontLineHeight;
    private int currentRowWidth;
    private FontMetrics fontMetrics;

    public TestLine() {
    	setFont(DEFAULT_FONT);
    	setForeground(DEFAULT_FOREGROUD);
    	setBackground(DEFAULT_BACKGROUD);
    	setPreferredSize(999999);
    }
    public void setPreferredSize(int row) {
    	int width = fontMetrics.stringWidth(String.valueOf(row));
    	if(currentRowWidth < width) {
    		currentRowWidth = width;
    		setPreferredSize(new Dimension(2*MARGIN + width +1,nHEIGHT));
    	}
    }
    @Override
    public void setFont(Font font) {
    	super.setFont(font);
    	fontMetrics = getFontMetrics(getFont());
    	fontLineHeight = fontMetrics.getHeight();
    }
    public int getLineHeight() {
    	if(lineHeight ==0) {
    		return fontLineHeight;
    	}
    	return lineHeight;
    }
    public void setLineHeight(int lineHeight) {
    	if(lineHeight > 0) {
    		this.lineHeight = lineHeight;
    	}
    }
    public int getStartOffset() {
    	return 4;
    }
    @Override
    protected void paintComponent(Graphics g) {
    	int nlineHeight = getLineHeight();
    	int startOffset = getStartOffset();
    	Rectangle drawHere = g.getClipBounds();
    	g.setColor(getBackground());
    	g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height);
    	g.setColor(getForeground());
    	int startLineNum = (drawHere.y/nlineHeight)+1;
    	int endLineNum = startLineNum + (drawHere.height/nlineHeight);
    	int start = (drawHere.y/nlineHeight)*nlineHeight+nlineHeight-startOffset;
    	for(int i = startLineNum;i<=endLineNum;++i) {
    		String lineNum = String.valueOf(i);
    		int width = fontMetrics.stringWidth(lineNum);
    		g.drawString(lineNum +" ", MARGIN + currentRowWidth-width-1, start);
    		start +=nlineHeight;
    	}
    	setPreferredSize(endLineNum);
    }
}
posted @ 2020-02-02 20:45  -筱  阅读(215)  评论(0编辑  收藏  举报