Re: basic GUI question
In article <h356hm$f7t$1@news.eternal-september.org>,
markspace <nospam@nowhere.com> wrote:
[...]
I thought I'd show you my solution.
[...]
Your excellent example prompted me to update my GUI launcher that uses
exec() to run programs in a separate JVM:
<code>
package gui;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/** @author John B. Matthews */
public class Launcher extends JPanel implements Runnable {
private final JButton launch = new JButton();
private final JLabel label = new JLabel();
ProcessBuilder pb = new ProcessBuilder(
"java", "-cp", "build/classes", "gui.DialogTest");
private volatile Process proc;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createGUI();
}
});
}
private static void createGUI() {
final JFrame frame = new JFrame();
frame.setLayout(new GridLayout(0, 1));
frame.add(new Launcher());
frame.add(new Launcher());
frame.add(new Launcher());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public Launcher() {
this.setPreferredSize(new Dimension(225, 50));
launch.addActionListener(new ActionListener() {
//@Override
public void actionPerformed(ActionEvent e) {
if (proc == null) {
launch.setText("Terminate");
label.setText("Status: run");
new Thread(Launcher.this).start();
} else {
proc.destroy();
reset();
}
}
});
this.add(launch);
this.add(label);
reset();
}
//@Override
public void run() {
try {
proc = pb.start();
int status = proc.waitFor();
} catch (IOException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
reset();
}
});
}
private void reset() {
proc = null;
launch.setText("Launch");
label.setText("Status: idle");
}
}
class DialogTest {
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Running",
"Test", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
});
}
}
</code>
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>