package src;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
@SuppressWarnings("serial")
public class TestFrame extends JFrame {
   JToolBar toolBar = new JToolBar();//创建一个工具栏
   JButton bNew = new JButton();//创建没有标签和图标的按钮
   JButton bOpen = new JButton();
   JButton bSave = new JButton();
   JButton bbSave=new JButton();
   JButton bComp = new JButton();
   JButton bRun = new JButton();
   JTextArea content = new JTextArea();
   JScrollPane jsp = new JScrollPane(content);//创建一个显示指定组件内容的 JScrollPane,只要组件的内容超过视图大小就会自动显示水平和垂直滚动条。
   File curFile = null;
   
     public TestFrame() {
   bNew.setToolTipText("新建");
   bNew.setIcon(new ImageIcon(TestFrame.class.getResource("/com/xyd/java/lesson12/pic/new.gif")));
   bOpen.setToolTipText("打开");
   bOpen.setIcon(new ImageIcon(TestFrame.class.getResource("/com/xyd/java/lesson12/pic/open.gif")));
   bSave.setToolTipText("保存");    
   bSave.setIcon(new ImageIcon(TestFrame.class.getResource("/com/xyd/java/lesson12/pic/save.gif")));
   bbSave.setToolTipText("另存为");
   bbSave.setIcon(new ImageIcon(TestFrame.class.getResource("/com/xyd/java/lesson12/pic/bbsave.gif")));
   bComp.setToolTipText("编译");
   bComp.setIcon(new ImageIcon(TestFrame.class.getResource("/com/xyd/java/lesson12/pic/comp.gif")));
   bRun.setToolTipText("运行");
   bRun.setIcon(new ImageIcon(TestFrame.class.getResource("/com/xyd/java/lesson12/pic/run.gif")));
   toolBar.add(bNew);
   toolBar.add(bOpen);
   toolBar.add(bSave);
   toolBar.add(bbSave);
   toolBar.add(bComp);
   toolBar.add(bRun);
       //打开
   bOpen.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser("."); //创建一个给定目录的对话框
if(chooser.showOpenDialog(TestFrame.this) == JFileChooser.CANCEL_OPTION) {
return ;//showOpenDialog(Component)显示文件打开对话框,参数为父组件对象
}

curFile = chooser.getSelectedFile();
content.setText("");
try {
BufferedReader br = new BufferedReader(new FileReader(curFile));
String msg = br.readLine();
while(msg != null) {
content.append(msg+"\n");
msg = br.readLine();
}

} catch (IOException e1) {
 JOptionPane.showMessageDialog(TestFrame.this, "打开文件失败!");
 
}

}
   
   });
       //编译
   bComp.addActionListener(new ActionListener(){ @Override
public void actionPerformed(ActionEvent e) {
if(curFile == null) {
JOptionPane.showMessageDialog(TestFrame.this, "没有要解析的文件");
return;
}

try { 

Runtime r = Runtime.getRuntime();
Process p = r.exec("javac -d " + curFile.getAbsoluteFile().getParent()  + " " + curFile.getAbsolutePath());
InputStream error = p.getErrorStream();
boolean success = true;

        StringBuilder errorMsg = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(error));
String msg;
while((msg = br.readLine()) != null) {
success = false;
errorMsg.append(msg+"\n");
}
        br.close();
        
         if(success) {
          JOptionPane.showMessageDialog(TestFrame.this, "编译成功.");
         } else {
          JOptionPane.showMessageDialog(TestFrame.this, "编译失败,原因:\n" + errorMsg.toString());
         }
} catch (Exception ee) {
JOptionPane.showMessageDialog(TestFrame.this, "编译失败,原因:" + ee.getMessage());
}
}
   
});    
   
   //运行
       bRun.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
   try { 

Runtime r = Runtime.getRuntime();
Process p = r.exec("java -cp" +" "+ curFile.getAbsoluteFile().getParent()  + " " + curFile.getAbsolutePath());//我想是这句话的问题
InputStream error = p.getErrorStream();
boolean success = true;

        StringBuilder errorMsg = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(error));
String msg;
while((msg = br.readLine()) != null) {
success = false;
errorMsg.append(msg+"\n");
}
        br.close();
        
         if(success) {
          JOptionPane.showMessageDialog(TestFrame.this, "运行成功.");
         } else {
          JOptionPane.showMessageDialog(TestFrame.this, "运行失败,原因:\n" + errorMsg.toString());
         }
} catch (Exception ee) {
JOptionPane.showMessageDialog(TestFrame.this, "运行失败,原因:" + ee.getMessage());
}  
   }
     
    });
  
   add(toolBar,BorderLayout.NORTH);
   add(jsp);
   setTitle("我的单元测试工具");
   setBounds(400,400,600,600);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setVisible(true);
   }
   
   public static void main(String[] args) {
   new TestFrame();
  
   }
   
   
}
我想是这句话的问题Process p = r.exec("java -cp" +" "+ curFile.getAbsoluteFile().getParent()  + " " + curFile.getAbsolutePath());运行这个程序后,打开自己写的另一个Java程序,按编译键,显示编译成功,但是按运行键就有问题,好像就是找不到的那个意思,改来改去弄不好,就只能请教了!!!

解决方案 »

  1.   

    ("java -cp" +" "+ curFile.getAbsoluteFile().getParent() + " " + curFile.getAbsolutePath())把这个字符串形成的命令在DOS环境下运行下,看是否能够正常。
      

  2.   

    我改了,Process p = r.exec("java -cp " + curFile.getAbsoluteFile().getParent()+"\\src "+ curFile.getName().substring(0, curFile.getName().length()-5));
    生成的.class文件在curFile.getAbsoluteFile().getParent()+"\\src 的目录下呀,curFile.getName().substring(0, curFile.getName().length()-5这句话得到文件名(不带后缀名)
    因为运行用Java -cp +.class的路径+文件名(不带.java)
    但还是不对,呵呵!帮帮忙!