Попытка использовать JButton в качестве InputStream

В настоящее время я пытаюсь создать свой собственный интерфейс для GDB. Пока все идет гладко, кроме одной части; вход в процесс, как только он был открыт. Я включу пример из моего кода ниже:

    private JButton run = new JButton("Run");
    JToolBar vertical = new JToolBar(JToolBar.VERTICAL);
    vertical.add(run);
    add(vertical, BorderLayout.WEST);

    run.addActionListener(new ActionListner()
    {
        public void actionPerformed(ActionEvent arg0)
        {
            Process proc;
            proc = Runtime.getRuntime().exec("gdb");
            proc = Runtime.getRuntime().exec("r");
        }
    }

Это позволило бы мне запустить команду «gdb» и передать весь ее вывод в мой TextArea, но после этого процесс закрывается, и я больше не могу запускать такие команды, как «r», для того же процесса, вместо этого он открывает другой one и пытается выполнить команду «r» самостоятельно; так есть ли способ выполнить их в том же процессе? Кроме того, поскольку это будет графический интерфейс, мне нужно, чтобы несколько кнопок могли взаимодействовать с одним и тем же процессом, то есть кнопка «Выполнить» должна иметь возможность выполнять «r», а кнопка «Точка останова» должна выполнить «b» для того же процесса, возможно ли это?

TL;DR: нужно запускать несколько системных команд из одного и того же процесса в Java с помощью графического интерфейса, возможно ли это?


person centip3de    schedule 03.09.2012    source источник


Ответы (3)


final PrintWriter out = new PrintWriter(proc.getOutputStream());
out.println("r");

Это не отдельные процессы, они являются входными данными для gdb. :-)

person obataku    schedule 03.09.2012
comment
Хммм... Как мне получить результат и передать его в свой JTextArea? - person centip3de; 04.09.2012
comment
@ centip3de нормальный вывод процесса уже передается в вашу текстовую область в соответствии с OP; выполнение этого не должно требовать каких-либо изменений. - person obataku; 04.09.2012
comment
Я пытаюсь использовать BufferedReaders для вывода в мою TextArea, которая до сих пор работала с Runtime (pastebin.com/hSK27piR (не удалось правильно отформатировать мой код в комментариях)). Однако, когда я добавляю ваш код после выполнения моего вызова Runtime(), переменная BufferedReader и lines имеет значение null - person centip3de; 04.09.2012

вам нужно абстрагироваться от вашего взаимодействия с GDB. Я бы сделал специальный интерфейс "DebugWithGDB" и объявил такие методы, как start/stop/breakpoint/etc.

в вашем случае вы пытаетесь связать GDB с вызовом вашего события (actionPerformed) и, более того, порождаете два процесса, которые отличаются друг от друга.

У меня была бы переменная в моем классе, и эта переменная содержала бы реализацию этого интерфейса. Таким образом, все кнопки будут иметь ссылку на эту переменную и смогут вызывать для нее команды.

Также рассмотрите возможность использования http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html, чтобы не замораживать ваш графический интерфейс (он поместит действие в основной поток очереди для вас)

person jdevelop    schedule 03.09.2012
comment
Вы не хотите работать над EDT, верно; но использование SwingUtilities делает это. Попробуйте вместо этого использовать Executor :-) - person obataku; 03.09.2012

Вам просто нужно получить потоки процесса, чтобы манипулировать им. Вы должны прочитать это: http://www.javaworld.com/jw-12-2000/jw-1229-traps.html.

Вот пример выполнения команд в одном процессе: Отправка команд на консоль приложение?

person davidbuzatto    schedule 03.09.2012