⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainframe.java

📁 java编的PL/0词法编译器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package compiler;

import java.io.*;
import java.util.*;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class MainFrame extends JFrame {
  private JPanel contentPane;
  private BorderLayout borderLayout1 = new BorderLayout();
  private JMenuBar jMenuBar=new JMenuBar();
  private JMenu jMenuFile=new JMenu("文件");
  private JMenuItem jMenuFile_New=new JMenuItem("新建...");
  private JMenuItem jMenuFile_Open=new JMenuItem("打开...");
  private JMenuItem jMenuFile_Close=new JMenuItem("关闭...");
  private JMenuItem jMenuFile_Save=new JMenuItem("保存");
  private JMenuItem jMenuFile_SaveAs=new JMenuItem("另存为...");
  private JMenuItem jMenuFile_Exit=new JMenuItem("退出");
  private JMenu jMenuRun=new JMenu("运行");
  private JMenuItem jMenuRun_Lexical=new JMenuItem("词法分析");
  private JMenuItem jMenuRun_Syntax=new JMenuItem("语法分析");
  private JMenuItem jMenuRun_Compile=new JMenuItem("编译");
  private JMenuItem jMenuRun_CloseResultPane=new JMenuItem("关闭调试窗口");
  private JMenu jMenuHelp=new JMenu("帮助");
  private JMenuItem jMenuHelp_About=new JMenuItem("关于...");


  private String currentDirectory="C:";//当前目录
  private File currentFile;//当前文件
  private LinkedList openFile;//打开文件列表,元素为File类型
  private LinkedList edited;//标识文件是否被修改过,元素为Boolean类型
  private LinkedList editPane;//编辑窗口列表,元素为JTextArea类型
  private HashMap resultPane;//编译结果窗口散列表,关键字为相应的editPane元素,值为为JTextArea类型
  private JTabbedPane jTabbedPane;//活页夹
  private LinkedList workPane;//活页上的工作区域列表
  private final int NEW=0;//创建新文件
  private final int OVERRIDE=1;//创建新文件并覆盖已有的同名文件
  private final int WRITE=2;//对当前文件进行写操作(强制覆盖)

  //Construct the frame
  public MainFrame() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  //Component initialization
  private void jbInit() throws Exception  {
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(borderLayout1);
    this.setSize(new Dimension(600, 450));
    this.setTitle("PL/O语言编译器");
    jMenuFile_New.addActionListener(new MainFrame_jMenuFile_New_actionAdapter(this));
    jMenuFile_Open.addActionListener(new MainFrame_jMenuFile_Open_actionAdapter(this));
    jMenuFile_Save.addActionListener(new MainFrame_jMenuFile_Save_actionAdapter(this));
    jMenuFile_SaveAs.addActionListener(new MainFrame_jMenuFile_SaveAs_actionAdapter(this));
    jMenuFile_Close.addActionListener(new MainFrame_jMenuFile_Close_actionAdapter(this));
    jMenuRun_Lexical.addActionListener(new MainFrame_jMenuRun_Lexical_actionAdapter(this));
    jMenuRun_CloseResultPane.addActionListener(new MainFrame_jMenuRun_CloseResultPane_actionAdapter(this));
    jMenuHelp_About.addActionListener(new MainFrame_jMenuHelp_About_actionAdapter(this));
    jMenuFile_Exit.addActionListener(new MainFrame_jMenuFile_Exit_actionAdapter(this));
    jMenuFile.add(jMenuFile_New);
    jMenuFile.add(jMenuFile_Open);
    jMenuFile.addSeparator();
    jMenuFile.add(jMenuFile_Save);
    jMenuFile.add(jMenuFile_SaveAs);
    jMenuFile.add(jMenuFile_Close);
    jMenuFile.addSeparator();
    jMenuFile.add(jMenuFile_Exit);
    jMenuBar.add(jMenuFile);
    jMenuRun.add(jMenuRun_Lexical);
    jMenuRun.add(jMenuRun_Syntax);
    jMenuRun.add(jMenuRun_Compile);
    jMenuRun.addSeparator();
    jMenuRun.add(jMenuRun_CloseResultPane);
    jMenuBar.add(jMenuRun);
    jMenuHelp.add(jMenuHelp_About);
    jMenuBar.add(jMenuHelp);
    this.setJMenuBar(jMenuBar);
    setMenuState(false);

    jTabbedPane=new JTabbedPane(JTabbedPane.BOTTOM);
    contentPane.add(jTabbedPane,BorderLayout.CENTER);

    openFile=new LinkedList();
    edited=new LinkedList();
    editPane=new LinkedList();
    resultPane=new HashMap();
    workPane=new LinkedList();
  }
  //Overridden so we can exit when window is closed
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  //设置某些菜单的状态
  private void setMenuState(boolean state){
    jMenuFile_Close.setEnabled(state);
    jMenuFile_Save.setEnabled(state);
    jMenuFile_SaveAs.setEnabled(state);
    jMenuRun_Lexical.setEnabled(state);
    jMenuRun_Syntax.setEnabled(state);
    jMenuRun_Compile.setEnabled(state);
    jMenuRun_CloseResultPane.setEnabled(state);
  }

  //文件存储方法,参数createNewFile标识是否创建新文件,参数override标识当所选文件夹下已有
  //同名文件时是否将其覆盖(仅在createNewFile的情况下才起作用),参数write标识是否对文件进
  //行写操作(强制覆盖)
  private void saveFile(int type){
    if(type==NEW){
      try{
        currentFile.createNewFile();
      }catch(IOException ioe){
        System.out.println("编译器在新建PL/O源文件时出错!");
      }
    }

    if(type==OVERRIDE){
      try{
        FileWriter fWriter = new FileWriter(currentFile);
        fWriter.write("");
        fWriter.close();
      }catch(IOException ioe){
        System.out.println("编译器在覆盖已有文件时出错!");
      }
    }

    if(type==WRITE){
      try{
        FileWriter fWriter=new FileWriter(currentFile);
        JTextArea area=(JTextArea)editPane.get(jTabbedPane.getSelectedIndex());
        String str=area.getText();
        fWriter.write(str);
        fWriter.close();
      }catch(IOException ioe){
        System.out.println("编译器在保存当前文件时出错!");
      }
    }
  }

  //存储新文件方法(会在"new"和"saveAs"菜单事件响应中被调用)
  //参数createNew为true时表明被"new"菜单事件相应程序调用
  //否则认为是被"saveAs"菜单事件响应程序调用
  private void saveNewFile(boolean createNew,String title){
    String selectedDirectory=currentDirectory;//记录JFileChooser的当前目录
    while(true){
        //新建JFileChooser
        JFileChooser fileChooser = new JFileChooser(selectedDirectory);
        fileChooser.setFileFilter(new SourceFileFilter());
        fileChooser.setDialogTitle(title);
        fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
        fileChooser.showSaveDialog(this);
        File file = fileChooser.getSelectedFile();

        if (file == null) { //未选择文件
          return;
        }

        selectedDirectory=(fileChooser.getCurrentDirectory()).toString();
        File selectedFile= new File(selectedDirectory, file.getName() + ".src");

        if (selectedFile.exists()) {
          fileChooser.setVisible(false);

          JOptionPane checkPane=new JOptionPane("文件"+selectedFile.getName()
          +"已经存在,是否将其覆盖?",JOptionPane.INFORMATION_MESSAGE,JOptionPane.YES_NO_CANCEL_OPTION);
          JDialog checkDialog=checkPane.createDialog(this,"覆盖文件");
          checkDialog.setVisible(true);

          if(checkPane.getValue()!=null){
            Integer option=(Integer)checkPane.getValue();
            if(option.intValue()==JOptionPane.YES_OPTION){
              currentDirectory = (fileChooser.getCurrentDirectory()).toString();
              currentFile = new File(currentDirectory, file.getName() + ".src");
              if(createNew){
                this.saveFile(OVERRIDE);
                addCurrentFile();
                setMenuState(true);
              }else{
                this.saveFile(WRITE);
              }
              return;
            }
          }
        }else{
          currentDirectory = (fileChooser.getCurrentDirectory()).toString();
          currentFile = new File(currentDirectory, file.getName() + ".src");
          if(createNew){
            this.saveFile(NEW);
            addCurrentFile();
            setMenuState(true);
          }else{
            this.saveFile(WRITE);
          }
          return;
        }
      }
  }

  //将当前文件添加到工作区
  private void addCurrentFile(){
    int index=jTabbedPane.getTabCount();
    openFile.add(currentFile);
    JPanel panel=new JPanel();
    panel.setLayout(new BorderLayout());
    JTextArea area=new JTextArea();
    JScrollPane scroll=new JScrollPane(area);
    try{
      FileReader fReader=new FileReader(currentFile);
      BufferedReader buffer=new BufferedReader(fReader);
      String str=buffer.readLine();
      while(str!=null){
        area.append(str+"\n");
        str=buffer.readLine();
      }
    }catch(IOException ioe){
      System.out.println("编译器在打开当前文件时出错!");
    }
    panel.add(scroll,BorderLayout.CENTER);
    jTabbedPane.add(panel,currentFile.getName());
    jTabbedPane.setSelectedIndex(index);
    editPane.add(area);
    workPane.add(panel);
    edited.add(new Boolean(false));

    //为area添加键盘事件响应
    area.addKeyListener(new KeyListener(){
      public void keyPressed(KeyEvent e){}
      public void keyReleased(KeyEvent e){
        int i=jTabbedPane.getSelectedIndex();
        edited.set(i,new Boolean(true));
      }
      public void keyTyped(KeyEvent e){}
    });
  }

  //"新建..."菜单事件响应
  void jMenuFile_New_actionPerformed(ActionEvent e){
    saveNewFile(true,"新建PL/O源程序文件");
    //注意:不要再调用addCurrentFile()方法了,因为在saveNewFile中已经调用过了!
  }

  //"打开..."菜单事件响应
  void jMenuFile_Open_actionPerformed(ActionEvent e) {
    //新建JFileChooser

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -