Editor

java-編寫簡單的編輯器(一)

本文編寫的編輯器模仿的是windows底下的記事本功能,並增加了高亮和自動保存的功能.


該編輯器功能如下:

  • 複製粘貼
  • 查找替換
  • 自動保存
  • 代碼高亮

這次只搭建簡單的框架,搭建出基本樣子

2016/03/12 更新
基本實現windows記事本功能,查找有錯。
(參考別人代碼,所以隨意轉載)

import java.awt.*;
import java.awt.event.*;
import java.awt.AWTEvent;
import java.awt.Font;
import java.text.*;
import java.util.*;
import java.io.*;
import java.io.IOException; 
import java.io.File; 
import javax.swing.undo.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.lang.reflect.Method;
import javax.swing.text.BadLocationException;

public class Editor extends JFrame{
    Container container = getContentPane();

    public ImageIcon icon = new ImageIcon("./lovexw.jpg");
    public Image image = icon.getImage();

    public JMenuBar menubar = new JMenuBar();
    public JMenu fileMenu,editMenu,formatMenu,viewMenu,helpMenu;
    public JMenuItem fileMenu_New,fileMenu_Open,fileMenu_Save,fileMenu_SaveAs,fileMenu_PageSetup,fileMenu_Print,fileMenu_Exit;
    public JMenuItem editMenu_Undo,editMenu_Redo,editMenu_Cut,editMenu_Copy,editMenu_Paste,editMenu_Delete,editMenu_Find,
     editMenu_GoTo,editMenu_SelectAll,editMenu_TimeDate;
    public JCheckBoxMenuItem formatMenu_LineWrap;
    public JMenuItem formatMenu_Font;
    public JCheckBoxMenuItem viewMenu_Status;
    public JMenuItem helpMenu_Help,helpMenu_About;
    public JTextArea editArea;
    public JLabel statusLabel = new JLabel("Current Location is 1 row, 1 line",JLabel.RIGHT);
    public JPopupMenu popupMenu;
    public JMenuItem popupMenu_Undo,popupMenu_Redo,popupMenu_Cut,popupMenu_Copy,popupMenu_Paste,popupMenu_Delete,popupMenu_SelectAll;
    public JList list;  
    public String currentValue,oldValue;    
    public String oldpath = null;
    public boolean isNewFile = true;
    public Toolkit toolKit=Toolkit.getDefaultToolkit();
    protected UndoManager undo = new UndoManager();
    public Font newfont;
    //protected UndoableEditListener undoHandler = new UndoHandler();

    public Editor(){
        super("windows notepad");

        JMenu fileMenu = new JMenu("File(F)",true);
        fileMenu.setMnemonic('F');
        fileMenu_New = new JMenuItem("New(N)", 'N');
        fileMenu_New.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
        fileMenu_New.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                currentValue = editArea.getText();
                if(currentValue.equals(oldValue)){
                    editArea.setText("");
                }
                else{
                    int result = JOptionPane.showConfirmDialog(null,"No Saved,Sure to create a new File?","Warning",JOptionPane.YES_NO_OPTION);
                    if(result == JOptionPane.YES_OPTION){
                        editArea.setText("");
                    }
                }
            }
        });
        fileMenu_Open = new JMenuItem("Open(O)", 'O');
        fileMenu_Open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
        fileMenu_Open.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                    JFileChooser fileChooser = new JFileChooser(oldpath);
                    //java file only
                    FileNameExtensionFilter filter = new FileNameExtensionFilter("JAVA File","java");
                    fileChooser.setFileFilter(filter);
                    //fileChooser's title
                    fileChooser.setDialogTitle("Open File");

                    int result = fileChooser.showOpenDialog(getParent());   //showOpenDialog(this) isn't right
                    if(result == JFileChooser.APPROVE_OPTION){
                        String name = fileChooser.getSelectedFile().getName();
                        String path = fileChooser.getSelectedFile().getPath();
                        oldpath = path;
                        int line = 1;
                        File file = new File(path);
                        BufferedReader reader = null;
                        try{
                            reader = new BufferedReader(new FileReader(file));
                            String temstring = null;
                            while((temstring = reader.readLine())!=null){
                                editArea.append(line + " " + temstring);
                                editArea.append("\n");
                                line ++;
                            }
                            reader.close();
                        }catch(IOException c){
                            c.printStackTrace();
                        }finally{
                            if(reader != null){
                                try{
                                    reader.close();
                                }catch(IOException d){
                                }
                            }
                        }
                        statusLabel.setText("Current Location is " + line + " row, 1 line");
                        oldValue = editArea.getText();
                        resetTitle(name);
                    }
            }
        });
        fileMenu_Save = new JMenuItem("Save(S)", 'S');
        fileMenu_Save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
        fileMenu_Save.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(isNewFile){
                    String str = null;

                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.setDialogTitle("Save File");

                    int result = fileChooser.showSaveDialog(getParent());
                    File saveFileName = fileChooser.getSelectedFile();
                    if(result == JFileChooser.APPROVE_OPTION){
                        try{
                            FileWriter fw = new FileWriter(saveFileName + ".java");
                            oldpath = saveFileName.getPath();
                            BufferedWriter bfw = new BufferedWriter(fw);
                            bfw.write(editArea.getText(),0,editArea.getText().length());
                            bfw.flush();
                            isNewFile = false;
                            fw.close();
                            oldValue = editArea.getText();
                        }catch(IOException c){

                        }
                    }
                }
                if(!oldValue.equals(editArea.getText())){
                    try{
                            FileWriter fw = new FileWriter(oldpath + ".java");
                            BufferedWriter bfw = new BufferedWriter(fw);
                            bfw.write(editArea.getText(),0,editArea.getText().length());
                            bfw.flush();
                            fw.close();
                            oldValue = editArea.getText();
                        }catch(IOException c){
                        }
                }
            }
        });
        fileMenu_SaveAs = new JMenuItem("Save As(A)...", 'A');
        fileMenu_SaveAs.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JFileChooser fileChooser = new JFileChooser("Save As");
                FileNameExtensionFilter filter = new FileNameExtensionFilter("JAVA File","java");
                fileChooser.setFileFilter(filter);
                int result = fileChooser.showSaveDialog(getParent());
                if(result == JFileChooser.APPROVE_OPTION){
                    File saveasfile = fileChooser.getSelectedFile();
                    try{
                            FileWriter fw = new FileWriter(saveasfile+".java");
                            BufferedWriter bfw = new BufferedWriter(fw);
                            bfw.write(editArea.getText(),0,editArea.getText().length());
                            bfw.flush();
                            isNewFile = false;
                            fw.close();
                            oldValue = editArea.getText();
                    }catch(IOException c){

                    }
                }
            }
        });
        fileMenu_PageSetup = new JMenuItem("Page Setup(U)...",'U');
        fileMenu_PageSetup.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                dialogShow();
            }
        });
        fileMenu_Exit = new JMenuItem("Exit(X)",'X');
        fileMenu_Exit.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if((isNewFile)||(!oldValue.equals(editArea.getText()))){
                    int result = JOptionPane.showConfirmDialog(null,"No Saved,Sure to Exit?","Warning",JOptionPane.YES_NO_OPTION);
                    if(result == JOptionPane.YES_OPTION){
                        System.exit(0);
                    }
                }
            }
        });


        JMenu editMenu = new JMenu("Edit(E)",true);
        editMenu.setMnemonic('E');
        editMenu_Undo = new JMenuItem("Undo(U)",'U');
        editMenu_Undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
        editMenu_Undo.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(undo.canUndo()){
                    try{
                        undo.undo();
                    }catch(CannotUndoException ex){
                        ex.printStackTrace();
                    }
                }
            }
        });
        editMenu_Redo = new JMenuItem("Redo(R)",'R');
        editMenu_Redo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y,InputEvent.CTRL_MASK));
        editMenu_Redo.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(undo.canRedo()){
                    try{
                        undo.redo();
                    }catch(CannotRedoException ex){
                        ex.printStackTrace();
                    }
                }
            }
        });
        editMenu_Cut = new JMenuItem("Cut(T)",'T');
        editMenu_Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
        editMenu_Cut.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                editArea.cut();
            }
        });
        editMenu_Copy = new JMenuItem("Copy(C)",'C');
        editMenu_Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
        editMenu_Copy.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                editArea.copy();
            }
        });
        editMenu_Paste = new JMenuItem("Paste(P)",'P');
        editMenu_Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
        editMenu_Paste.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                editArea.paste();
            }
        });
        editMenu_Delete = new JMenuItem("Delete(L)",'L');
        editMenu_Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
        editMenu_Delete.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                editArea.replaceSelection(null);
            }
        });
        editMenu_Find = new JMenuItem("Find(F)...",'F');
        editMenu_Find.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
        editMenu_Find.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                search();
            }
        });
        editMenu_GoTo = new JMenuItem("Go(G)...",'G');
        editMenu_GoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
        editMenu_GoTo.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane pane = new JOptionPane();
                String s = pane.showInputDialog(null,"Go to","Please input the line number",JOptionPane.YES_OPTION);
                if(s!=null){
                    int result = Integer.valueOf(s).intValue();
                    try{
                        int position = editArea.getLineStartOffset(result) - 1;
                        editArea.setCaretPosition(position);
                    }catch(Exception ex){
                        ex.printStackTrace();
                    }
                }
            }
        });
        editMenu_SelectAll = new JMenuItem("Select All",'A');
        editMenu_SelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
        editMenu_SelectAll.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                editArea.selectAll();
            }
        });
        editMenu_TimeDate = new JMenuItem("Time/Date(D)",'D');
        editMenu_TimeDate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
        editMenu_TimeDate.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                int y,m,d,h,mi,s;    
                Calendar cal=Calendar.getInstance();    
                y=cal.get(Calendar.YEAR);
                m=cal.get(Calendar.MONTH);
                d=cal.get(Calendar.DATE);
                h=cal.get(Calendar.HOUR_OF_DAY);
                mi=cal.get(Calendar.MINUTE);
                s=cal.get(Calendar.SECOND);
                //Date date=new Date();
                //DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                //String time=format.format(date);
                editArea.insert(y+" year "+m+" mouth "+d+" day "+h+":"+mi+":"+s,editArea.getCaretPosition());
            }
        });

        JMenu formatMenu = new JMenu("Format(O)", true);
        formatMenu.setMnemonic('O');
        formatMenu_LineWrap = new JCheckBoxMenuItem("Line Wrap(W)");
        formatMenu_LineWrap.setMnemonic('W');
        formatMenu_LineWrap.setState(true);
        formatMenu_LineWrap.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e){
                if(formatMenu_LineWrap.getState()){
                    editArea.setLineWrap(true);
                }
                else{
                    editArea.setLineWrap(false);
                }
            }
        });
        formatMenu_Font = new JMenuItem("Font(F)...",'F');
        formatMenu_Font.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                dialogforfont();
            }
        });

        JMenu viewMenu = new JMenu("View(V)", true);
        viewMenu.setMnemonic('V');
        viewMenu_Status = new JCheckBoxMenuItem("Status Bar(S)");
        viewMenu_Status.setMnemonic('S');
        viewMenu_Status.setState(false);
        viewMenu_Status.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e){
                if(viewMenu_Status.getState()){
                    status();
                    fresh();
                    statusLabel.setVisible(true);

                }
                else{
                    statusLabel.setVisible(false);
                }
            }
        });

        JMenu helpMenu = new JMenu("Help(H)", true);
        helpMenu.setMnemonic('H');
        helpMenu_Help = new JMenuItem("Help(H)",'H');
        helpMenu_Help.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));

        helpMenu_Help.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String helpTopicsStr=new String("<center><br>lalalal<br><a href=http:// target=_blank>"+"http://</a><br><br><br>"+"demo</center>");

                JEditorPane editPane=new JEditorPane("text/html",helpTopicsStr);
                editPane.setEditable(false);
                try{
                java.net.URI uri = java.net.URI.create("http://www.baidu.com/");  
                java.awt.Desktop dp = java.awt.Desktop.getDesktop() ;    
                if (dp.isSupported(java.awt.Desktop.Action.BROWSE))
                    dp.browse(uri);
                }catch(Exception c){
                    c.printStackTrace();
                }
            }
        });
        helpMenu_About = new JMenuItem("About(A)",'A');
        helpMenu_About.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane.showMessageDialog(null,
                "           demo    \n" + 
                "           fo      \n" + 
                "           java    \n",
                "About",JOptionPane.INFORMATION_MESSAGE);
            }
        });

        menubar.add(fileMenu);
        fileMenu.add(fileMenu_New);
        fileMenu.add(fileMenu_Open);
        fileMenu.add(fileMenu_Save);
        fileMenu.add(fileMenu_SaveAs);
        fileMenu.addSeparator();  
        fileMenu.add(fileMenu_PageSetup);
        fileMenu.addSeparator();  
        fileMenu.add(fileMenu_Exit);

        menubar.add(editMenu);
        editMenu.add(editMenu_Undo);
        editMenu.add(editMenu_Redo);
        editMenu.addSeparator();  
        editMenu.add(editMenu_Cut);
        editMenu.add(editMenu_Copy);
        editMenu.add(editMenu_Paste);
        editMenu.add(editMenu_Delete);
        editMenu.addSeparator();   
        editMenu.add(editMenu_Find);
        editMenu.add(editMenu_GoTo);
        editMenu.addSeparator();    
        editMenu.add(editMenu_SelectAll);
        editMenu.add(editMenu_TimeDate);

        menubar.add(formatMenu);
        formatMenu.add(formatMenu_LineWrap);
        formatMenu.addSeparator(); 
        formatMenu.add(formatMenu_Font);

        menubar.add(viewMenu);
        viewMenu.add(viewMenu_Status);

        menubar.add(helpMenu);
        helpMenu.add(helpMenu_Help);
        helpMenu.addSeparator();
        helpMenu.add(helpMenu_About);

        editArea = new JTextArea();
        JScrollPane scroller = new JScrollPane(editArea);
        scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        container.add(scroller,BorderLayout.CENTER);
        editArea.setWrapStyleWord(true);
        editArea.setLineWrap(true);
        Font font = new Font("TimesRoman",Font.PLAIN,17);
        editArea.setFont(font);
        editArea.setBackground(Color.white);  
        editArea.setForeground(Color.black);
        editArea.getDocument().addUndoableEditListener(new UndoableEditListener(){
            public void undoableEditHappened(UndoableEditEvent e) {
                undo.addEdit(e.getEdit());
            }  
        });

        popupMenu=new JPopupMenu();
        popupMenu_Undo=new JMenuItem("Undo(U)",'U');
        popupMenu_Redo=new JMenuItem("Redo(R)",'R');
        popupMenu_Cut =new JMenuItem("Cut(T)",'T');
        popupMenu_Copy=new JMenuItem("Copy(C)",'C');
        popupMenu_Paste=new JMenuItem("Paset(P)",'P');
        popupMenu_Delete=new JMenuItem("Delete(D)",'D');
        popupMenu_SelectAll=new JMenuItem("Select all(A)",'A');     

        popupMenu.add(popupMenu_Undo);
        popupMenu.add(popupMenu_Redo);
        popupMenu.addSeparator();
        popupMenu.add(popupMenu_Cut);
        popupMenu.add(popupMenu_Copy);  
        popupMenu.add(popupMenu_Paste); 
        popupMenu.add(popupMenu_Delete);
        popupMenu.addSeparator();

        editArea.addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                int mods = e.getModifiers();
                if(mods == InputEvent.BUTTON3_MASK)
                    popupMenu.show(e.getComponent(),e.getX(),e.getY());
            }

            //兩個方法都可以的
            /*public void mousePressed(MouseEvent e){
                triggerEvent(e);
            }   

            public void triggerEvent(MouseEvent e){
                if(e.isPopupTrigger())
                    popupMenu.show(e.getComponent(),e.getX(),e.getY());
            }*/             
        });
        try{
            String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
            UIManager.setLookAndFeel(lookAndFeel);
            SwingUtilities.updateComponentTreeUI(this);
        }catch(Exception e){
            e.printStackTrace();
        }

        this.setJMenuBar(menubar);
        this.setSize(1050,650);
        this.setLocation(100,50);
        this.setTitle("XW");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setIconImage(image);
        this.setVisible(true);
    }

    public void search(){
        final JDialog searchDialog = new JDialog();

        Container con = searchDialog.getContentPane();
        con.setLayout(new FlowLayout(FlowLayout.LEFT));

        JLabel searchlabel = new JLabel("Search:");
        JLabel replacelabel = new JLabel("Replace by");
        final JTextField searchtext = new JTextField(15);
        final JTextField replacetext = new JTextField(15);
        final JCheckBox matchcase = new JCheckBox("Seperated by big characters");
        ButtonGroup bgroup = new ButtonGroup();
        final JRadioButton up = new JRadioButton("Up");
        final JRadioButton down = new JRadioButton("Down");
        down.setSelected(true);
        bgroup.add(up);
        bgroup.add(down);
        JButton next = new JButton("Find Next");
        JButton replace = new JButton("Replace");
        final JButton replaceall = new JButton("Replace All");

        next.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(searchtext.getText().equals("")){
                    JOptionPane.showMessageDialog(searchDialog,"Search Field can't be empty'!","Warning",JOptionPane.WARNING_MESSAGE);
                }
                else{
                    String a;
                    String b;
                    if(matchcase.isSelected()){
                        a = editArea.getText();
                        b = searchtext.getText();
                    }
                    else{
                        a = editArea.getText().toLowerCase();
                        b = searchtext.getText().toLowerCase();
                    }
                    if(down.isSelected()){
                        int l = a.indexOf(b,l0);
                        if(l > 0){
                            l0 = l + 1;
                            editArea.select(l,l + searchtext.getText().length());
                        }
                        else{
                            JOptionPane.showMessageDialog(searchDialog,"No next","Warning",JOptionPane.WARNING_MESSAGE);
                        }
                    }
                    if(up.isSelected()){

                    }
                }
            }
        });

        replace.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(replacetext.getText()== null && editArea.getSelectedText()!= null){
                    System.out.println("kong succeed!");
                    editArea.replaceSelection("");
                }
                else if(replacetext.getText()!= null && editArea.getSelectedText()!= null){
                    System.out.println("fei kong succeed!");
                    editArea.replaceSelection(replacetext.getText());
                }
            }
        });

        replaceall.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                editArea.setCaretPosition(0);
                int a = 0;
                int b = 0;
                int replaceCount = 0;
                if(searchtext.getText()==null){
                    JOptionPane.showMessageDialog(searchDialog,"Please Input the Search String!","Warning",JOptionPane.WARNING_MESSAGE);
                    searchtext.requestFocus(true);
                    return ;
                }
                while(a > -1){
                    int startpos = editArea.getCaretPosition();
                    String sa,sb;
                    String s1 = editArea.getText();
                    String s2 = s1.toLowerCase();
                    String s3 = searchtext.getText();
                    String s4 = s3.toLowerCase();

                    if(matchcase.isSelected()) {
                        sa = s1;
                        sb = s3;
                    }
                    else{
                        sa = s2;
                        sb = s4;
                    }
                    if(up.isSelected()){
                        if(editArea.getSelectedText() == null){
                            a = sa.lastIndexOf(sb,startpos - 1);
                        }
                        else{
                            a = sa.lastIndexOf(sb,startpos - searchtext.getText().length() - 1);
                        }
                    }
                    else if(down.isSelected()){
                        if(editArea.getSelectedText() == null){
                            a = sa.indexOf(sb,startpos);
                        }
                        else{
                            a = sa.indexOf(sb,startpos - searchtext.getText().length() + 1);
                        }
                    }
                }
            }
        });

        JPanel bottomPanel=new JPanel();
        JPanel centerPanel=new JPanel();
        JPanel topPanel=new JPanel();

        JPanel direction=new JPanel();
        direction.setBorder(BorderFactory.createTitledBorder("direction:"));
        direction.add(up);
        direction.add(down);

        JPanel replacePanel=new JPanel();
        replacePanel.setLayout(new GridLayout(2,1));
        replacePanel.add(replace);
        replacePanel.add(replaceall);
        topPanel.add(searchlabel);
        topPanel.add(searchtext);
        topPanel.add(next);
        centerPanel.add(replacelabel);
        centerPanel.add(replacetext);
        centerPanel.add(replacePanel);
        bottomPanel.add(matchcase);
        bottomPanel.add(direction);
        //bottomPanel.add(cancelbutton);
        con.add(topPanel);
        con.add(centerPanel);
        con.add(bottomPanel);

        searchDialog.setTitle("Search");
        searchDialog.setSize(400,350);
        searchDialog.setLocation(450,200);
        searchDialog.setResizable(false);
        searchDialog.setVisible(true);
    }

    public void dialogforfont(){
        final JDialog fontDialog = new JDialog();

        final JLabel example = new JLabel("demo for font");
        example.setHorizontalAlignment(SwingConstants.CENTER);
        example.setPreferredSize(new Dimension(200,30));

        fontDialog.setTitle("Font Setup");
        Container con=fontDialog.getContentPane();
        con.setLayout(new FlowLayout(FlowLayout.LEFT));

        final Font currentFont=editArea.getFont();
        newfont = currentFont;

        JLabel font = new JLabel("Font:");
        font.setPreferredSize(new Dimension(100,20));
        JLabel style = new JLabel("style");
        style.setPreferredSize(new Dimension(100,20));
        JLabel size = new JLabel("size");
        size.setPreferredSize(new Dimension(100,20));

        final JTextField nfont = new JTextField(10);
        nfont.setPreferredSize(new Dimension(30,30));
        final JTextField nstyle = new JTextField(8);
        nstyle.setPreferredSize(new Dimension(30,30));
        final JTextField nsize = new JTextField(3);
        nsize.setPreferredSize(new Dimension(30,30));
        nfont.setText(currentFont.getFontName());
        nfont.selectAll();
        if(currentFont.getStyle()==Font.PLAIN)
            nstyle.setText("chang gui");
        else if(currentFont.getStyle()==Font.BOLD)
            nstyle.setText("cu ti");
        else if(currentFont.getStyle()==Font.ITALIC)
            nstyle.setText("xie ti");
        else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))
            nstyle.setText("cu xie ti");
        nstyle.requestFocus();
        nstyle.selectAll();
        nsize.setText(currentFont.getSize()+"");
        nsize.requestFocus();
        nsize.selectAll();

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        final String fontname[] = ge.getAvailableFontFamilyNames();
        int defaultFontIndex = 0;
        for(int i = 0;i < fontname.length;i ++){
            if(fontname[i].equals(currentFont.getFontName())){
                defaultFontIndex = i;
                break;
            }
        }
        final JList listfont = new JList(fontname);
        listfont.setSelectedIndex(defaultFontIndex);
        listfont.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listfont.setVisibleRowCount(7);
        listfont.setFixedCellWidth(82);
        listfont.setFixedCellHeight(20);
        listfont.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent event){
                nfont.setText(fontname[listfont.getSelectedIndex()]);
                nfont.requestFocus();
                nfont.selectAll();
                Font newFont = new Font(nfont.getText(),newfont.getStyle(),newfont.getSize());
                example.setFont(newFont);
                newfont = newFont;
            }
        });

        final String fontstyle[] = {"chang gui","cu ti","xie ti","cu xie ti"};
        final JList liststyle = new JList(fontstyle);
        liststyle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        if(currentFont.getStyle()==Font.PLAIN)
            liststyle.setSelectedIndex(0);
        else if(currentFont.getStyle()==Font.BOLD)
            liststyle.setSelectedIndex(1);
        else if(currentFont.getStyle()==Font.ITALIC)
            liststyle.setSelectedIndex(2);
        else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))
            liststyle.setSelectedIndex(3);

        liststyle.setVisibleRowCount(7);
        liststyle.setVisibleRowCount(7);
        liststyle.setFixedCellWidth(99);
        liststyle.setFixedCellHeight(20);
        liststyle.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent e){
                nstyle.setText(fontstyle[liststyle.getSelectedIndex()]);
                nstyle.requestFocus();
                nstyle.selectAll();
                int newstyle = 0;
                if(nstyle.getText().equals("chang gui")){
                    newstyle = Font.PLAIN;
                }
                else if(nstyle.getText().equals("cu ti")){
                    newstyle = Font.BOLD;
                }
                else if(nstyle.getText().equals("xie ti")){
                    newstyle = Font.ITALIC;
                }
                else{
                    newstyle = Font.BOLD + Font.ITALIC;
                }
                Font newFont = new Font(nfont.getText(),newstyle,newfont.getSize());
                example.setFont(newFont);
                newfont = newFont;
            }
        });

        final String fontsize[] = {"11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30"};
        final JList listsize = new JList(fontsize);
        int defaultFontSizeIndex = 0;
        for(int i = 0;i < fontsize.length;i ++){
            if(fontsize[i].equals(currentFont.getSize() + "")){
                defaultFontSizeIndex = i;
                break;
            }
        }
        listsize.setSelectedIndex(defaultFontSizeIndex);
        listsize.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listsize.setVisibleRowCount(7);
        listsize.setFixedCellWidth(39);
        listsize.setFixedCellHeight(20);
        listsize.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent e){
                nsize.setText(fontsize[listsize.getSelectedIndex()]);
                nsize.requestFocus();
                nsize.selectAll();
                Font newFont = new Font(nfont.getText(),newfont.getStyle(),Integer.valueOf(nsize.getText()));
                example.setFont(newFont);
                newfont = newFont;
            }
        });

        JButton fontokbutton = new JButton("OK");
        fontokbutton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                editArea.setFont(newfont);
                fontDialog.dispose();
            }
        });

        JButton fontcancelbutton = new JButton("Cancel");
        fontcancelbutton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                fontDialog.dispose();   
            }
        });

        JPanel samplePanel=new JPanel();
        samplePanel.setBorder(BorderFactory.createTitledBorder("示例"));
        samplePanel.add(example);

        con.add(font);
        con.add(style);
        con.add(size);
        con.add(nfont);
        con.add(nstyle);
        con.add(nsize);
        con.add(new JScrollPane(listfont));
        con.add(new JScrollPane(liststyle));
        con.add(new JScrollPane(listsize));
        con.add(samplePanel);
        con.add(fontokbutton);
        con.add(fontcancelbutton);

        fontDialog.setSize(350,340);
        fontDialog.setLocation(200,200);
        fontDialog.setResizable(false);
        fontDialog.setVisible(true);
   }

   public void fresh(){
        this.validate();
   }

    public void status(){
        editArea.addCaretListener(new CaretListener(){
            public void caretUpdate(CaretEvent e){ 
                try{ 
                    int pos = editArea.getCaretPosition(); 
                    int lineOfC = editArea.getLineOfOffset(pos) + 1; 
                    int col = pos - editArea.getLineStartOffset(lineOfC - 1) + 1;
                    statusLabel.setText("Current Location is " + lineOfC + " row, " + col + " line");
                }catch(Exception ex) 
                {
                    statusLabel.setText("No Location");
                } 
            } 
        });
        container.add(statusLabel,BorderLayout.SOUTH);
    }

    public void resetTitle(String s){
        String str = s.substring(0,s.length()-5);
        this.setTitle(str + " - XW");
    }

    public void dialogShow(){
        JDialog dialog = new JDialog(this,"Page Setup");
        dialog.setSize(400,300);
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);
    }

    public static void main(String[] args){
        Editor example = new Editor();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章