package a;
public class javaEdit
{
public static void main(String[] args)
{
MyTest mt=new MyTest();
}
}
package a;
public class ListEle
{
String text;
int index;
public ListEle(String text, int index)
{
this.text=text;
this.index=index;
}
public ListEle()
{
text = "";
index= 0;
}
}
package a;
import java.util.LinkedList;
class MyQueue
{
private LinkedList<ListEle> ll = new LinkedList<ListEle>();
public void put(ListEle o)
{
ll.addFirst(o);
}
public ListEle get(int index)
{
return ll.get(index);
}
public int size()
{
return ll.size();
}
public void removeLast()
{
ll.removeLast();
}
public void clear()
{
ll.clear();
}
}
package a;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class MyTest extends JFrame implements ActionListener
{
// 定义所需要的组件
TextArea jta = null;
TextArea jta1 = null;
// 菜单条
JMenuBar jmb = null;
JMenu jm = null, jm1 = null, jmNew, jmHelp;
JMenuItem jmi1 = null,jmi11;
JMenuItem jmi2 = null, jmi3 = null, jmi4 = null, jmi5, jmi6, jmHelp1,
jmBefore, jmNext;
String fileNameE, fN, end = ".java";
String name = "ClassName", namefile = "";
String savepath = "", openName = "";
String javaName = "";// 保存打开的文件后java程序的名称
String ph;
File path;
boolean isSaveJava = false;// 定义一个标志,程序是否保存
boolean isBianyi = false;
int isOpenOrNew = 0;// 定义一个变量,用于判断是打开的java文件(isOpenOrNew=1)还是新建的java程序(isopenOrNew=2)
int runOpenOrNew = 0;// 定义一个变量,用于判断运行的是打开的java文件(isOpenOrNew=1)还是新建的java程序(isopenOrNew=2)
int currentStep = 0, step = 1;
MyQueue mq = new MyQueue();
public MyTest()
{
this.setTitle("记事本");
// 初始化文本编译器(代码区)
jta = new TextArea("/**\n*代码区间*/\n", 10, 50);// 文本编辑于
jta.setBackground(Color.pink);// 设置颜色
jta.setFont(new Font("Dialog", Font.PLAIN, 15));
// 初始化文本编译器(运行区)
jta1 = new TextArea("编译运行区间", 10, 50);
jta1.setBackground(Color.green);
jta1.setFont(new Font("Dialog", Font.PLAIN, 15));
// 初始化工具栏
jmb = new JMenuBar();
// 初始化菜单栏
jm = new JMenu("文件");
jm1 = new JMenu("运行");
jmNew = new JMenu("项目");
jmHelp = new JMenu("帮助(H)");
// 设置助记符
jm.setMnemonic('F');
jm1.setMnemonic(1);
// 初始化子菜单列表
jmi1 = new JMenuItem("打开文件", new ImageIcon("./image/61.gif"));
jmi2 = new JMenuItem("文件另存为", new ImageIcon("./image/61.gif"));
jmi11=new JMenuItem("退出", new ImageIcon("./image/61.gif"));
jmi3 = new JMenuItem("编译", new ImageIcon("./image/61.gif"));
jmi4 = new JMenuItem("运行", new ImageIcon("./image/61.gif"));
jmi5 = new JMenuItem("新建Java", new ImageIcon("./image/61.gif"));
jmi6 = new JMenuItem("保存java", new ImageIcon("./image/61.gif"));
jmHelp1 = new JMenuItem("帮助", new ImageIcon("./image/61.gif"));
jmBefore = new JMenuItem("上一步", new ImageIcon("./image/61.gif"));
jmNext = new JMenuItem("下一步", new ImageIcon("./image/61.gif"));
// 注册监听
jmi5.addActionListener(this);
jmi5.setActionCommand("newjava");
jmi6.addActionListener(this);
jmi6.setActionCommand("savejava");
jmi1.addActionListener(this);
jmi1.setActionCommand("open");
jmi2.addActionListener(this);
jmi2.setActionCommand("save");
jmi11.addActionListener(this);
jmi11.setActionCommand("exit");
jmi3.addActionListener(this);
jmi3.setActionCommand("bianyi");
jmi4.addActionListener(this);
jmi4.setActionCommand("run");
jmHelp1.addActionListener(this);
jmHelp1.setActionCommand("help");
jmBefore.addActionListener(this);
jmBefore.setActionCommand("before");
jmNext.addActionListener(this);
jmNext.setActionCommand("next");
// 设置工具栏
this.setJMenuBar(jmb);
// 加入菜单栏
jmb.add(jm);// 文件
jmb.add(jm1);// 运行
jmb.add(jmNew);// 项目
jmb.add(jmHelp);// 帮助
// 加入菜单栏的子选项
// 文件的子菜单
jm.add(jmi1);
jm.add(jmi2);
jm.add(jmi11);
// 运行的子菜单
jm1.add(jmi6);
jm1.add(jmi3);
jm1.add(jmi4);
// 项目的子菜单
jmNew.add(jmi5);
jmNew.add(jmBefore);
jmNew.add(jmNext);
// 帮助的子菜单
jmHelp.add(jmHelp1);
// 设置布局管理其
this.setLayout(new GridLayout(2, 1));
this.add(jta);
this.add(jta1);
// 设置窗口大小
this.setSize(800, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
// 将jta(即文本编辑区)增加键盘的监听事件
jta.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent e)
{
addQ();
}
});
}
public void addQ()
{
// jta.getCaretPosition()返回文本插入符的位置。插入符的位置被限制在 0
// 和文本最后一个字符(包括)之间。如果没有设置文本或插入符,则默认插入符的位置为 0。
ListEle list = new ListEle(jta.getText(), jta.getCaretPosition());
if (jta.getText().length() > 0)
{
if (mq.size() < 200)
{
mq.put(list);
}
else
{
mq.removeLast();//移除并返回此列表中的最后一个元素
mq.put(list);
}
}
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("open"))
{
openFile();
}
else if (e.getActionCommand().equals("save"))
{
saveFile();
}
else if(e.getActionCommand().equals("exit"))
{
int a=JOptionPane.showConfirmDialog(this, "确定要离开?");
if(a==0)
{
System.exit(1);
}
}
else if (e.getActionCommand().equals("newjava"))
{
newJava();
}
else if (e.getActionCommand().equals("savejava"))
{
saveJava();
}
else if (e.getActionCommand().equals("bianyi"))
{
bianyiJava();
}
else if (e.getActionCommand().equals("run"))
{
runJava();
}
else if (e.getActionCommand().equals("help"))// 帮助菜单
{
helpFile();
}
else if (e.getActionCommand().equals("before"))// 上一步
{
if (currentStep + step <= mq.size() - 1)
{
currentStep += step;
}
else
{
currentStep = mq.size() - 1;
}
jta.setText(mq.get(currentStep).text);
}
else if (e.getActionCommand().equals("next"))// 下一步
{
if (currentStep - step >= 0)
{
currentStep -= step;
}
else
{
currentStep = 0;
}
jta.setText(mq.get(currentStep).text);
}
}
private void helpFile()
{
System.out.println("nihao");
String help1 = "各按钮用法说明:" + "\n\n" + "1.保存文件默认是在当前目录下(即和编译器exe文件相同目录)。";
String help2 = "\n\n" + "2.如果要把其他地方复制好的代码直接贴到编辑区编译,"
+ "\n首先用所贴代码相应的*.java文件名来【新建】";
String help3 = "一个新文件再覆盖自动生成的代码,否则编译器将无法得到文件名而出错。" + "\n\n";
String help4 = "加到指定位置。" + "\n\n"
+ "6.本程序暂时需要JDK1.6版本才可运行,没有1.6版的同学可以用javac/java自行编译\n";
String help5 = "程序附带的源代码来使用。" + "\n\n" + "说明:" + "\n";
String help6 = "如果对其中某个部分比较感兴趣,可以联系我一起讨论。" + "\n\n"
+ ".第一次编写这类软件,没啥经验,";
String help7 = "所以肯定是BUG满天飞,如果有兴趣让它变得更完善,或者有其他意见或者建议,请及时联系我,谢谢!";
String help8 = "\n\n" + "QQ: 799078779 " + "\n\n"
+ "E-mail: 799078779@qq.com" + "\n\n";
JOptionPane.showMessageDialog(this, help1 + help2 + help3 + help4
+ help5 + help6 + help7 + help8, "帮助",
JOptionPane.QUESTION_MESSAGE);
}
private void runJava()
{
// try
// {
// System.out.println("ph+name="+ph.toString()+"\\"+name);
//
// //访问这个类
// Class cls=Class.forName(ph.toString()+"\\"+name+".class");
// //调用main方法
// Method main=cls.getMethod("main", new Class[] {String[].class});
//
// main.invoke(null, new Object[] {new String[0]});
// //System.setOut(new PrintStream(jta1.getText()));
//
// }
// catch(Exception e2)
// {
// e2.printStackTrace();
// }
if (isBianyi == true)
{
if (isOpenOrNew == 2)
{
Runtime rt = Runtime.getRuntime();
try
{
String s, cmd;
cmd = new String("java " + name);// Java的执行命令
Process p = rt.exec(cmd);// 调用进程去执行命令
jta1.setText(jta1.getText() + "执行命令:" + cmd + "\n");// 重定向执行结果
// 重定向错误信息
BufferedReader err = new BufferedReader(
new InputStreamReader(p.getErrorStream()));
while ((s = err.readLine()) != null)
{
jta1.setText(jta1.getText() + s + "\n");
}
// 重定向输出信息(将输出的信息存放到jta1中显示出来)
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = in.readLine()) != null)
{
jta1.setText(jta1.getText() + s + "\n");
}
}
catch (Exception eee)
{
eee.printStackTrace();
}
}
if (isOpenOrNew == 1)
{
javaName = javaName.substring(0, javaName.length() - 5);
System.out.println("javaName=" + javaName);
Runtime rt = Runtime.getRuntime();
try
{
String s, cmd, cm;
cmd = new String("java " + javaName);// Java的执行命令
Process p = rt.exec(cmd);// 调用进程去执行命令
jta1.setText(jta1.getText() + "执行命令:" + cmd + "\n");// 重定向执行结果
// 重定向错误信息
BufferedReader err = new BufferedReader(
new InputStreamReader(p.getErrorStream()));
while ((s = err.readLine()) != null)
{
jta1.setText(jta1.getText() + s + "\n");
}
// 重定向输出信息(将输出的信息存放到jta1中显示出来)
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = in.readLine()) != null)
{
jta1.setText(jta1.getText() + s + "\n");
}
}
catch (Exception eee)
{
eee.printStackTrace();
}
}
}
else
{
showMessage("郑云飞友情提示您:请先编译");
}
}
private void bianyiJava()
{
if (isSaveJava == true && isOpenOrNew == 2)
{
// System.out.println("path="+path.toString());
// JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// int results = compiler.run(null, null, null,path.toString());
// jta1.setText((results == 0) ? "郑云飞友情提示您:编译成功\n" :
// "郑云飞友情提示您:编译失败\n");
// jta1.setText(jta1.getText() + "执行命令:" + "javac "
// +name+".java"+"\n");
Runtime t1 = Runtime.getRuntime();
String cmd = new String("javac " + fileNameE);
try
{
Process p = t1.exec(cmd);
isBianyi = true;
jta1.setText("执行命令:" + cmd + "\n");
BufferedReader err = new BufferedReader(new InputStreamReader(p
.getErrorStream()));// 重定向错误信息
String s = "", totalS = "";
while ((s = err.readLine()) != null)
{
jta1.setText(jta1.getText() + s + "\n");
}
// jta1.setText(totalS+"\n");
// 重定向输出信息
BufferedReader in = new BufferedReader(new InputStreamReader(p
.getInputStream()));
String sin = "", totalSin = "";
while ((sin = in.readLine()) != null)
{
jta1.setText(jta1.getText() + sin + "\n");
}
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
else if (isSaveJava == true && isOpenOrNew == 1)
{
Runtime t1 = Runtime.getRuntime();
String cmd = new String("javac " + openName);
try
{
Process p = t1.exec(cmd);
jta1.setText("执行命令:" + cmd + "\n");
BufferedReader err = new BufferedReader(new InputStreamReader(p
.getErrorStream()));// 重定向错误信息
String s = "", totalS = "";
while ((s = err.readLine()) != null)
{
jta1.setText(jta1.getText() + s + "\n");
}
// jta1.setText(totalS+"\n");
// 重定向输出信息
BufferedReader in = new BufferedReader(new InputStreamReader(p
.getInputStream()));
String sin = "", totalSin = "";
while ((sin = in.readLine()) != null)
{
jta1.setText(jta1.getText() + sin + "\n");
}
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
else
{
String str = "郑云飞友情提示您:请先保存您编写的程序";
showMessage(str);
jta1.setText(str);
}
}
private void saveJava()
{
isSaveJava = true;
String file = "";
if (isOpenOrNew == 1)
{
file = new String(openName);
}
else if (isOpenOrNew == 2)
{
file = new String(name + ".java");
}
File dir = new File(".");
ph = new String();
try
{
ph = dir.getCanonicalPath();// 返回此抽象路径名的规范路径名字符串。
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
path = new File(ph + "\\" + file);
int i = 10;
if (path.exists())
{
i = JOptionPane.showConfirmDialog(this, "文件已经存在是否覆盖?");
// 如果选择是 i=0 否i=1 取消 i=2 点击× i=-1
System.out.println("i=" + i);
}
if (i == JOptionPane.YES_OPTION || i == 10)
{
BufferedReader in = new BufferedReader(new StringReader(jta.getText()));
try
{
PrintWriter out = new PrintWriter(file);
String s;
while ((s = in.readLine()) != null)
{
out.println(s);
}
jta1.setText(jta1.getText() + "执行命令:保存文件到当前目录。" + "\n");
if (out != null)
{
out.close();
}
}
catch (IOException ee)
{
ee.printStackTrace();
}
}
else if (i == JOptionPane.NO_OPTION)
{
jta1.setText(jta1.getText() + "文件未保存。" + "\n");
}
}
private void newJava()
{
isOpenOrNew = 2;// 标志是新建的java程序,而不是打开的java程序
boolean flag = true;
String head = "/**"
+ "\n"
+ " * 项目名称:Java可视化编译器\n"
+ " * 创作人:郑云飞\n * 项目大纲:1.Swing,2.IO 3,线程\n * 版本:java 1.0测试版\n*/\n";
while (flag)
{
flag = false;
fileNameE = JOptionPane.showInputDialog("输入文件名称(例如 abc.java ):");
if (!(fileNameE.endsWith(".java")))
{
showMessage("文件名类型错误,应为 *.java");
flag = true;
}
else
{
name = new String(fileNameE
.substring(0, fileNameE.indexOf(end)));// 获取输入的类名称
// 自动生成的代码
jta.setText(head);
jta.setText(jta.getText() + "public class " + name
+ "\n{\n\tpublic static void main(String[] args)"
+ "\n\t{");
jta
.setText(jta.getText()
+ "\t\n\t\t"
+ "System.out.println(\"欢迎进入java编程世界,您可以在这里畅游java品味人生!\");"
+ "\n\t}\n}");
}
}
}
private void saveFile()
{
// 文件选择组件
JFileChooser jfc = new JFileChooser();
// 设置名字
jfc.setDialogTitle("请选择保存的路径....");
// 默认方式
jfc.showSaveDialog(null);
// 显示
jfc.setVisible(true);
savepath = jfc.getSelectedFile().getAbsolutePath();
namefile = jfc.getSelectedFile().getParent();
Writer fr = null;
BufferedReader br = null;
BufferedWriter bw = null;
try
{
fr = new FileWriter(savepath);
bw = new BufferedWriter(fr);
bw.write(this.jta.getText());
System.out.println("保存成功");
if (bw != null)
{
bw.close();
}
if (br != null)
{
br.close();
}
}
catch (Exception e1)
{
showMessage("保存失败");
jta1.setText("保存失败");
}
}
private void openFile()
{
isOpenOrNew = 1;// 标志是打开的java程序,而不是新建的java程序
// 文件选择组件
JFileChooser jfc = new JFileChooser();
// 设置名字
jfc.setDialogTitle("请选择文件....");
// 默认方式
jfc.showOpenDialog(null);
// 显示
jfc.setVisible(true);
String filepath = jfc.getSelectedFile().getAbsolutePath();
openName = jfc.getSelectedFile().getName();// 获取打开的文件名
javaName = jfc.getSelectedFile().getName();
BufferedReader br = null;
FileReader fr = null;
try
{
fr = new FileReader(filepath);
br = new BufferedReader(fr);// 封装管道流
String s = "";
String total = "";
while ((s = br.readLine()) != null)
{
// 将读到的数据存放的jta中
total += s + "\r\n";
}
jta.setText(total);
if (br != null)
{
br.close();
}
if (fr != null)
{
fr.close();
}
}
catch (Exception e1)
{
showMessage("打开失败");
}
}
public static void showMessage(String str)
{
JOptionPane.showMessageDialog(null, str, "错误",
JOptionPane.ERROR_MESSAGE);
}
}