Реализация простой Java IDE с использованием Runtime Process и JTextArea - PullRequest
0 голосов
/ 13 марта 2012

Я занимаюсь разработкой простой Java IDE, такой как Netbeans / Eclipse. Мой графический интерфейс включает в себя два компонента JTextArea, один из которых используется в качестве TextEditor, где конечный пользователь может вводить свои программы, а другой - в качестве окна вывода.

Я запускаю пользовательские программы, вызывая командную строку windows через классы Java Runtime и Process. Я также ловлю потоки ввода-вывода процесса, используя методы getInputStream (), getErrorStream (), getOutputStream ().

Если программа содержит только операторы для печати чего-либо на экране, я могу отобразить вывод в окне вывода (JTextArea). Но если он включает в себя операторы для чтения ввода от пользователя, тогда у пользователя должна быть возможность ввести ожидаемое значение ввода через окно вывода, и оно должно быть отправлено процессу так же, как в Netbeans / Eclipse.

Я также проверил следующую ссылку Java: работа со стандартным / стандартным процессом одновременно

Используя этот код, я могу отображать только операторы, ожидающие ввода, а не простые операторы вывода. Кроме того, в окне вывода одновременно отображается только одна строка.

Было бы здорово, если бы кто-нибудь помог мне решить эту проблему.

Спасибо

Haleema

1 Ответ

0 голосов
/ 23 марта 2012

Я нашел решение с небольшой модификацией к предыдущему посту Java: работа с stdin / stdout процесса одновременно

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) {}

    }
}
...