📄 mainframe.java
字号:
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 + -