Implementation of simple Java IDE using Runtime Process and JTextArea

前端 未结 1 1455
滥情空心
滥情空心 2021-01-29 01:40

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 ot

相关标签:
1条回答
  • 2021-01-29 01:51

    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) {}
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题