谢谢大家,问题1,4,5已经解决了!
现在就剩两问题了,我总结了一下就是: 比如我现在要做一个像JCreator这样的工具我应该如何对它编译使它生成Class文件然后再如何执行它! 我自己的想法是:通过调用javac和java命令来执行(),可是这样一来如果程序有错误也不会在你自己做的那个工具里显示啊,我就想读取出系统提示的错误,可是不会弄?或者自己做个错误提示出来,那样需要把API中所有的包,类,方法,字段,及它们之间的继承关系给弄出来,这个也不知道该怎么弄?
现在就剩两问题了,我总结了一下就是: 比如我现在要做一个像JCreator这样的工具我应该如何对它编译使它生成Class文件然后再如何执行它! 我自己的想法是:通过调用javac和java命令来执行(),可是这样一来如果程序有错误也不会在你自己做的那个工具里显示啊,我就想读取出系统提示的错误,可是不会弄?或者自己做个错误提示出来,那样需要把API中所有的包,类,方法,字段,及它们之间的继承关系给弄出来,这个也不知道该怎么弄?
package util;import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;import javax.swing.JTextArea;public class CommandExecutor {
private String[] command;
private String directory;
private Process process;
private JTextArea infoTextArea; public CommandExecutor(String[] command, String directory) {
this.command = command;
this.directory = directory;
} public void destroy() {
process.destroy();
} public void setInfoTextArea(JTextArea infoTextArea) {
this.infoTextArea = infoTextArea;
} public void exec() {
BufferedReader reader = null; try {
ProcessBuilder pb = new ProcessBuilder(command);
pb.directory(new File(directory));
process = pb.start(); if (infoTextArea != null) {
String str = "";
for (String temp : command) {
str += " " + temp;
}
infoTextArea.append("\n");
infoTextArea.append(str);
infoTextArea.append("\n");
}
// Handle error output information
final InputStream errorIn = process.getErrorStream();
Thread thread = new Thread() {
public void run() {
BufferedReader errorReader = null;
try {
errorReader = new BufferedReader(new InputStreamReader(errorIn));
String error = null; while ((error = errorReader.readLine()) != null) {
if (infoTextArea != null) {
infoTextArea.append(error);
infoTextArea.append("\n");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (errorReader != null) {
try {
errorReader.close();
} catch (Exception e2) {
}
}
}
}
};
thread.start(); // Handle normal output information.
InputStream in = process.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
String line = null; while ((line = reader.readLine()) != null) {
if (infoTextArea != null) {
infoTextArea.append(line);
infoTextArea.append("\n");
}
} } catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception e2) {
}
}
}
}
}
package ui;import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;import util.CommandExecutor;
import util.CustomFileFilter;
import util.ImageButton;
import util.SwingUtilities;
import util.SwingWorker;@SuppressWarnings("serial")
public class RunFrame extends JFrame {
public static void main(String[] args) {
RunFrame frame = new RunFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
SwingUtilities.centerFrame(frame);
frame.setVisible(true);
} private JTextField pathTextField;
private JTextField argumentsTextField;
private JButton runButton;
private JButton browseButton;
private JTextArea infoTextArea;
private ImageButton stopButton;
private Image stopImage;
private Image runningImage;
private Runner javaApplicationRunner;
private CommandExecutor executor; public RunFrame() {
super("Run");
initialize();
layoutComponents();
} private void initialize() {
stopImage = SwingUtilities.getImage("images/running.png");
runningImage = SwingUtilities.getImage("images/stop.png");
pathTextField = new JTextField(22);
argumentsTextField = new JTextField();
browseButton = new JButton("Browse...");
runButton = new JButton("Run");
stopButton = new ImageButton(stopImage);
infoTextArea = new JTextArea();
infoTextArea.setEditable(false); browseButton.addActionListener(new BrowseActionListener());
runButton.addActionListener(new RunActionListener());
stopButton.addActionListener(new StopActionListener());
} private void layoutComponents() {
JPanel northPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH;
c.gridx = 0;
c.gridy = 0;
northPanel.add(new JLabel("Path:", SwingConstants.LEFT), c);
c.gridx = 1;
c.gridy = 0;
c.weightx = 1.0;
northPanel.add(pathTextField, c);
c.gridx = 2;
c.gridy = 0;
c.weightx = 0.0;
northPanel.add(browseButton, c); c.gridx = 0;
c.gridy = 1;
northPanel.add(new JLabel("Arguments:"), c);
c.gridx = 1;
c.gridy = 1;
c.weightx = 1.0;
northPanel.add(argumentsTextField, c);
c.gridx = 2;
c.gridy = 1;
c.weightx = 0.0;
northPanel.add(runButton, c); JScrollPane scroller = new JScrollPane(infoTextArea);
scroller.setBorder(BorderFactory.createEtchedBorder()); JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
southPanel.add(stopButton); getContentPane().add(northPanel, BorderLayout.NORTH);
getContentPane().add(scroller, BorderLayout.CENTER);
getContentPane().add(southPanel, BorderLayout.SOUTH);
} private void compile(String directory, String path) {
//String[] command = { "javac", "-classpath", directory, path };
String[] command = { "javac", path };
executor = new CommandExecutor(command, directory);
executor.setInfoTextArea(infoTextArea);
executor.exec();
} private void run(String directory, String className, String[] args) {
javaApplicationRunner = new Runner(directory, className, args);
Thread thread = new Thread(javaApplicationRunner);
thread.start();
} private String[] extractArguments(String argsString) {
List<String> argsList = new LinkedList<String>();
StringTokenizer tokenizer = new StringTokenizer(argsString, " ");
while (tokenizer.hasMoreTokens()) {
argsList.add(tokenizer.nextToken());
} return argsList.toArray(new String[0]);
} private class BrowseActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser(".");
CustomFileFilter filter = new CustomFileFilter(new String[] { ".java", ".class" });
chooser.addChoosableFileFilter(filter);
int result = chooser.showOpenDialog(null); if (result == JFileChooser.APPROVE_OPTION) {
File classFile = chooser.getSelectedFile();
//pathTextField.setText(classFile.getAbsolutePath());
try {
pathTextField.setText(classFile.getCanonicalPath());
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
} private class RunActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String path = pathTextField.getText(); if (!path.endsWith(".class") && !path.endsWith(".java")) {
JOptionPane.showMessageDialog(RunFrame.this,
"Please select a java or class file to run.");
return;
} int index = path.lastIndexOf(File.separator);
String directory = path.substring(0, index + 1);
String name = path.substring(index + 1);
String[] args;
if (name.endsWith(".class")) {
index = name.lastIndexOf(".class");
name = name.substring(0, index);
} else if (name.endsWith(".java")) {
index = name.lastIndexOf(".java");
name = name.substring(0, index); compile(directory, path);
}
String argsString = argumentsTextField.getText();
args = extractArguments(argsString); run(directory, name, args);
// run(directory, directory + name, args); // Error
}
} private class StopActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (javaApplicationRunner != null) {
javaApplicationRunner.stop();
}
}
} private class Runner extends SwingWorker {
private String[] command;
private String directory; public Runner(String directory, String className, String[] args) {
this.directory = directory; List<String> commandList = new LinkedList<String>();
commandList.add("java"); commandList.add(className);
for (String arg : args) {
commandList.add(arg);
} this.command = commandList.toArray(new String[0]);
} public void stop() {
executor.destroy();
} public void init() {
stopButton.setNormalImage(runningImage);
} public void finish() {
stopButton.setNormalImage(stopImage);
} public void work() {
executor = new CommandExecutor(command, directory);
executor.setInfoTextArea(infoTextArea);
executor.exec();
}
}
}