Re: How to send console progress information to gui
On 5/2/2013 2:49 PM, mike wrote:
I am using java to send a commdline arg 'mklabel ?config hello.o REL3'.
The output that I get is a new line for each element a put the label on.
In my application I want to show the user the progress of the command.
Can I create an event that contains the information for each line and send it to a listener? Or is there a better way?
Assuming you use Swing for GUI then see the code below for inspiration.
Arne
====
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class CommandOutputDisplay extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea out;
private JTextArea err;
private JTextField cmd;
private JButton exe;
public CommandOutputDisplay() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BorderLayout());
JPanel outerr = new JPanel();
outerr.setLayout(new GridLayout(1, 2));
JPanel outwrap = new JPanel();
outwrap.setLayout(new BorderLayout());
outwrap.add(new JLabel("Output"), BorderLayout.NORTH);
out = new JTextArea(20, 80);
outwrap.add(new JScrollPane(out), BorderLayout.CENTER);
outerr.add(outwrap);
JPanel errwrap = new JPanel();
errwrap.setLayout(new BorderLayout());
errwrap.add(new JLabel("Error"), BorderLayout.NORTH);
err = new JTextArea(20, 80);
errwrap.add(new JScrollPane(err), BorderLayout.CENTER);
outerr.add(errwrap);
getContentPane().add(outerr, BorderLayout.CENTER);
JPanel cmdexe = new JPanel();
cmdexe.setLayout(new BorderLayout());
cmdexe.add(new JLabel("Command:"), BorderLayout.WEST);
cmd = new JTextField("", 80);
cmdexe.add(cmd, BorderLayout.CENTER);
exe = new JButton("Execute");
exe.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
execute();
}
});
cmdexe.add(exe, BorderLayout.EAST);
getContentPane().add(cmdexe, BorderLayout.SOUTH);
pack();
}
private void execute() {
try {
Process p = Runtime.getRuntime().exec(cmd.getText());
(new GUIReader(p.getInputStream(), out)).start();
(new GUIReader(p.getErrorStream(), err)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame f = new CommandOutputDisplay();
f.setVisible(true);
}
});
}
}
class GUIReader extends Thread {
private BufferedReader br;
private JTextArea ta;
public GUIReader(InputStream is, JTextArea ta) {
this.br = new BufferedReader(new InputStreamReader(is));
this.ta = ta;
}
public void run() {
String line;
try {
while((line = br.readLine()) != null) {
final String line2 = line;
EventQueue.invokeLater(new Runnable() {
public void run() {
ta.append(line2 + "\r\n");
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}