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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With