Reputation: 903
I'm trying to run a BASH script inside a shell spawned by Java and then display the results of said BASH script with a JTextArea.
import java.io.IOException;
public class Bobsors {
public static Mainframe frame;
public static void main(String[] args) {
frame = new Mainframe();
frame.start();
run();
}
public static void run() {
String[] cmd = new String[]{"/bin/sh", "PATH=~/Desktop/bobsors.sh"};
try {
Process process = Runtime.getRuntime().exec(cmd);
frame.setLog(process);
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.border.TitledBorder;
@SuppressWarnings("serial")
public class Mainframe extends JFrame {
private JPanel contentPane;
public static Mainframe frame;
public static JTextArea log = new JTextArea();
/**
* Launch the application.
*/
public void start() {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame = new Mainframe();
frame.setVisible(true);
frame.setTitle("Bobsors Java Application.");
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public void setLog(Process process) {
log.setText(process.toString());
}
/**
* Create the frame.
*/
public Mainframe() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(null, "Shell Log", TitledBorder.LEADING, TitledBorder.TOP, null, null));
panel.setBounds(7, 50, 434, 217);
contentPane.add(panel);
panel.setLayout(null);
log.setBounds(5, 17, 424, 210);
log.setEditable(false);
panel.add(log);
JLabel lblBobsors = new JLabel("Bobsors");
lblBobsors.setBounds(12, 12, 70, 15);
contentPane.add(lblBobsors);
JLabel lblWorksOnLinux = new JLabel("Works on Linux only");
lblWorksOnLinux.setBounds(12, 26, 203, 15);
contentPane.add(lblWorksOnLinux);
}
}
When running the only thing that gets displayed is this "java.lang.UNIXProcess@509d5bae" Does anyone know how to properly do this?
Upvotes: 3
Views: 316
Reputation: 7076
Process
doesn't override the default toString()
method inherited from Object
hence why its displaying that value.
Instead you can use getInputStream()
, which will return an InputStream
object which you can convert to a string like this: Read/convert an InputStream to a String.
Also don't forget tasks on the EDT
(event dispatch thread) must finish quickly; if they don't, unhandled events back up and the user interface becomes unresponsive, so make sure you use another thread.
Upvotes: 3
Reputation: 629
You can use, InputStream
and a BufferedReader
to read output, something like this
InputStream input = process.getInputStream();
BufferedReader result = new BufferedReader(new InputStreamReader(input));
Convert to String
StringBuilder builder = new StringBuilder();
String line="";
while((line=result.readLine()) != null){
builder.append(line + "\n");
}
Please add try
& catch
appropriately.
Upvotes: 0