Java 如何从JOptionPane获取输入并将其传递给Process或ProcessBuilder?

Java 如何从JOptionPane获取输入并将其传递给Process或ProcessBuilder?,java,Java,我正在从JOptionPane获取输入,我想将获取的输入传递给一个将运行java程序并获取输入的进程。所以,基本上我想说的是,我正在做一个非常简单的JavaIDE作为一个学校项目,我必须运行由IDE中的某个人编写的java程序。现在他们的程序可能需要输入。我正在使用JOptionPane获取输入,并试图将其传递到我的IDE以成功运行程序 下面是我的run()方法,它将运行他们的java程序: public static void run(String path) throws IOExcepti

我正在从JOptionPane获取输入,我想将获取的输入传递给一个将运行java程序并获取输入的进程。所以,基本上我想说的是,我正在做一个非常简单的JavaIDE作为一个学校项目,我必须运行由IDE中的某个人编写的java程序。现在他们的程序可能需要输入。我正在使用JOptionPane获取输入,并试图将其传递到我的IDE以成功运行程序

下面是我的
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