Java 如何从JOptionPane获取输入并将其传递给Process或ProcessBuilder?
我正在从JOptionPane获取输入,我想将获取的输入传递给一个将运行java程序并获取输入的进程。所以,基本上我想说的是,我正在做一个非常简单的JavaIDE作为一个学校项目,我必须运行由IDE中的某个人编写的java程序。现在他们的程序可能需要输入。我正在使用JOptionPane获取输入,并试图将其传递到我的IDE以成功运行程序 下面是我的Java 如何从JOptionPane获取输入并将其传递给Process或ProcessBuilder?,java,Java,我正在从JOptionPane获取输入,我想将获取的输入传递给一个将运行java程序并获取输入的进程。所以,基本上我想说的是,我正在做一个非常简单的JavaIDE作为一个学校项目,我必须运行由IDE中的某个人编写的java程序。现在他们的程序可能需要输入。我正在使用JOptionPane获取输入,并试图将其传递到我的IDE以成功运行程序 下面是我的run()方法,它将运行他们的java程序: public static void run(String path) throws IOExcepti
run()
方法,它将运行他们的java程序:
public static void run(String path) throws IOException {
int dotIndex = path.indexOf(".");
String code = editorArea.getText();
String input = "";
path = path.substring(0, dotIndex);
if (code.contains("Scanner")) {
input = JOptionPane.showInputDialog(frame, "Enter the inputs separated by |, if any:");
}
// String[] argss = { "cmd", "/c", "java " + path };
//ProcessBuilder pb = new ProcessBuilder(argss); //This line does not throw error but it does not show any output too.
ProcessBuilder pb = new ProcessBuilder("java " + path); //This line throws IOException -> The system cannot find the file specified
Process process = pb.start();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
writer.write(input + "\n");
writer.flush();
String line = "", output = "";
while ((line = reader.readLine()) != null) {
System.out.println("i am here" + line);
output += line;
}
reader.close();
writer.close();
outputArea.setText(output); //outputArea is an object of JTextArea
}
我通过引用编写了上述代码。以下代码对我有用。但是请注意,
扫描仪读取的输入不显示。也不是代码利用了JDK 11中添加的(启动单文件源代码程序)
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.Font;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JSplitPane;
导入javax.swing.JTextArea;
导入javax.swing.SwingConstants;
导入javax.swing.WindowConstants;
公共类IdeRunna实现ActionListener,Runnable{
私有静态最终模式类\ u名称;
私有静态最终字符串RUN=“RUN”;
私有JFrame;
私人JTextArea编辑区;
私人区域输出区;
静止的{
CLASS_NAME=Pattern.compile(\\bpublic\\s+CLASS\\s+(\\w+);
}
私有静态字符串getClassName(字符串源代码){
字符串className=null;
if(sourceCode!=null&&!sourceCode.isEmpty()){
Matcher Matcher=CLASS_NAME.Matcher(源代码);
if(matcher.find()){
className=matcher.group(1);
}
}
返回类名;
}
@重写//java.lang.Runnable
公开募捐{
showGui();
}
@重写//java.awt.event.ActionListener
已执行的公共无效操作(操作事件){
字符串actionCommand=event.getActionCommand();
开关(动作命令){
案例运行:
试一试{
运行代码();
}
捕获(异常x){
x、 printStackTrace();
}
打破
违约:
}
}
私有JButton createButton(字符串文本、int助记符、字符串工具提示){
JButton按钮=新JButton(文本);
按钮。设置助记符(助记符);
按钮。设置工具提示文本(工具提示);
addActionListener(这个);
返回按钮;
}
私有JPanel CreateButtonPanel(){
JPanel buttonPanel=新的JPanel();
添加(createButton(“运行”,KeyEvent.VK_R,“运行代码”);
返回按钮面板;
}
私有JScrollPane createEditor(){
editorArea=新的JTextArea(20,70);
editorArea.setFont(新字体(“等距”,Font.PLAIN,12));
JScrollPane scrollPane=新的JScrollPane(editorArea);
scrollPane.setColumnHeaderView(新的JLabel(“编辑器”);
返回滚动窗格;
}
私有JScrollPane createOutput(){
outputArea=新的JTextArea(20,70);
outputArea.setFont(新字体(“等距”,Font.PLAIN,12));
outputArea.setEditable(假);
JScrollPane scrollPane=新的JScrollPane(输出区域);
setColumnHeaderView(新的JLabel(“程序输出”,SwingConstants.CENTER));
返回滚动窗格;
}
私有JSplitPane createSplitPane(){
JSplitPane splitPane=新的JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
createEditor(),
createOutput());
splitPane.setDividerLocation(0.5d);
返回拆分窗格;
}
私有字符串getUserInput(字符串源代码){
字符串输入=”;
if(sourceCode!=null&&!sourceCode.isEmpty()){
if(sourceCode.contains(“Scanner”)){
输入=作业窗格。显示输入对话框(框架,
“输入以|分隔的输入,如果有:”;
}
}
返回输入;
}
private void runCode()引发InterruptedException,IOException{
字符串sourceCode=editorrea.getText();
字符串className=getClassName(源代码);
Path Path=Path.get(System.getProperty(“user.dir”)、className+“.java”);
try(BufferedWriter bw=Files.newBufferedWriter(路径)){
write(源代码);
}
字符串输入=getUserInput(源代码);
ProcessBuilder pb=新的ProcessBuilder(“java”,path.getFileName().toString());
processproc=pb.start();
InputStream=proc.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
BufferedReader br=新的BufferedReader(isr);
OutputStream os=proc.getOutputStream();
write(input.getBytes());
write(System.lineSeparator().getBytes());
os.flush();
字符串progOutput=br.readLine();
while(progOutput!=null){
outputrea.append(progOutput);
outputArea.append(“\n”);
progOutput=br.readLine();
}
进程waitFor();
}
私有void showGui(){
框架=新的JFrame(“IDE”);
frame.setDefaultCloseOp