Implementation of simple Java IDE using Runtime Process and JTextArea

不羁岁月 提交于 2019-12-02 17:02:12

问题


I am developing a simple Java IDE like Netbeans/Eclipse. My GUI includes two JTextArea component, one used as a TextEditor where the end user can type in his programs and the other used as an output window.

I am running the users programs by invoking the windows command prompt through Java Runtime and Process classes. I am also catching the IO streams of the process using the methods getInputStream(), getErrorStream(), getOutputStream().

If the program contains only the statements to print something onto the screen, I am able to display the output on the output window(JTextArea). But if it includes statements to read input from the user, then it must be possible for the user to type the expected input value via the output window and it must be sent to the process just as in Netbeans/Eclipse.

I also checked the following link java: work with stdin/stdout of process in same time

Using this code, I am able to display only the statements waiting for input and not simple output statements. Also, only a single line is displayed on the output window at a time.

It would be great if anybody can help me to resolve this issue.

Thanks

Haleema


回答1:


I've found the solution with little modification to the earlier post java: work with stdin/stdout of process in same time

class RunFile implements Runnable{

    public Thread program = null;
    public Process process = null;

    private JTextArea console; 
    private String fn;
    public RunFile(JTextArea cons,String filename){ 
        console = cons;
        fn=filename;
        program = new Thread(this);
        program.start();
    }

    @Override
    public void run() {     
        try {  
String commandj[]  =  new String[4];
commandj[0] = "cmd";
commandj[1]="/C";
commandj[2]="java";
commandj[3] = fn;

String envp[] = new String[1];
envp[0]="path=C:/Program Files (x86)/Java/jdk1.6.0/bin";
File dir = new File("Path to File");

Runtime rt = Runtime.getRuntime();
process = rt.exec(commandj,envp,dir);

            ReadStdout read = new ReadStdout(process,console); 
            WriteStdin write = new WriteStdin(process, console);

            int x=process.waitFor();  


            console.append("\nExit value: " + process.exitValue() + "\n");  
        }
        catch (InterruptedException e) {} 
        catch (IOException e1) {}       
    }
}


class WriteStdin implements Runnable{

    private Process process = null;
    private JTextArea console = null;
    public Thread write = null;
    private String input = null;
    private BufferedWriter writer = null;

    public WriteStdin(Process p, JTextArea t){

        process = p;
        console = t;
        writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

        write = new Thread(this);
        write.start();

        console.addKeyListener(new java.awt.event.KeyAdapter() {

            @Override
            public void keyTyped(java.awt.event.KeyEvent e){

                //save the last lines for console to variable input
                if(e.getKeyChar() == '\n'){

                    try {                  

                        int line = console.getLineCount() -2;
                        int start = console.getLineStartOffset(line);
                        int end = console.getLineEndOffset(line);

                        input = console.getText(start, end  - start);

                        write.resume();

                    } catch (BadLocationException e1) {}
                }
            }
        });
        console.addCaretListener(new javax.swing.event.CaretListener() {

            @Override
            public void caretUpdate(CaretEvent e) {
           console.setCaretPosition(console.getDocument().getLength());     
                throw new UnsupportedOperationException("Not supported yet.");

            }
        });

        console.addFocusListener(new java.awt.event.FocusAdapter() {
            @Override
        public void focusGained(java.awt.event.FocusEvent e)
        {
                              console.setCaretPosition(console.getDocument().getLength());     
         }    

        });
    }


    @Override
    public void run(){
        write.suspend();
        while(true){
            try {
                //send variable input in stdin of process
                writer.write(input);
                writer.flush();

            } catch (IOException e) {}
            write.suspend();
        }
    }
}



class ReadStdout implements Runnable{

    public Thread read = null;
    private BufferedReader reader = null;
    private Process process = null;
private JTextArea console = null;
    public ReadStdout(Process p,JTextArea t){

        process = p;
        reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
console = t;
        read = new Thread(this);
        read.start();
    }

    public void run() {
        String line;
        try {
        while((line = reader.readLine())!=null)                       
          console.append(line+"\n");
             }catch (IOException e) {}

    }
}


来源:https://stackoverflow.com/questions/9677455/implementation-of-simple-java-ide-using-runtime-process-and-jtextarea

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!