T
tuxedo
Gast
Hallo,
habe folgendes Problem:
Ich hab mir ein kleiens Tool geschrieben das ein .EXE Programm ausführen soll. Der Output erscheint dann in einem JTextArea.
Mein Programm besteht aus einer Klasse die von JFrame erbt und enthält ein JTextArea und 3 JButtons.
In der Main-Methode starte ich mein Programm mit
Zum ausführen der Exe habe ich 2 Methode die ich aus Guido Krügers Java-Buch fast 1:1 übernommen habe:
Starte ich mein EXE Programm mit
im Konstruktor meines JFrames dann dann startet dieses und steckt seinen Output und das JTextArea. Geht also prima.
Problem ist nun folgendes:
Das EXE-Programm soll per Button gestartet und beendet werden. Dazu habe ich per ActionPerformed-Methode dies hier gemacht:
Der connectButton soll das Programm starten, der disconnectButton soll es beenden.
Starte ich jetzt mein EXE-Programm nicht per Konstruktor sondern per Button bleibt der Button gedrückt hängen und das Programm hängt und läuft nichtmehr weiter.
Ich habe bereits unterschiedliche Kombinationen ausprobier und auch mal ein anderes Programm starten lassen. Jedes mal das gleiche. Sobald ich per Button den Start aslöse hängt das Programm. Der Witz an der Geschichte ist: Das Programm wird geladen. Im Windows Taskmanager taucht es auf, nur hab ich keine Ausgabe und laufen tut es auch nicht. Zumindest macht es nicht das was es normalerweise machen sollte.
Zweites kleines Problem:
Starte ich die Exe wieder über den JFrame-Konstruktor und versuche es mit dem disconnectButton zu beenden tut sich da gar nix. Das Programm läuft lustig weiter.
Any Ideas ?
gruß
Alex
habe folgendes Problem:
Ich hab mir ein kleiens Tool geschrieben das ein .EXE Programm ausführen soll. Der Output erscheint dann in einem JTextArea.
Mein Programm besteht aus einer Klasse die von JFrame erbt und enthält ein JTextArea und 3 JButtons.
In der Main-Methode starte ich mein Programm mit
Code:
new MeinProgramm();
Zum ausführen der Exe habe ich 2 Methode die ich aus Guido Krügers Java-Buch fast 1:1 übernommen habe:
Code:
private void runCommand(String cmd, int mode) throws IOException {
rt = Runtime.getRuntime();
System.out.println("Running " + cmd);
pr = rt.exec(cmd);
if (mode == MODE_WAITFOR) {
System.out.println("waiting for termination");
try {
pr.waitFor();
}
catch (InterruptedException e) {
}
}
else if (mode == MODE_CATCHOUTPUT) {
System.out.println("catching output");
BufferedReader procout = new BufferedReader(new InputStreamReader(pr.getInputStream()) );
String line;
int a;
while ((a = procout.read()) != 0) {
char A;
A=(char)a;
textArea.append(A+"");
textArea.setCaretPosition(textArea.getText().length());
}
}
try {
System.out.println("done, return value is " + pr.exitValue());
}
catch (IllegalThreadStateException e) {
System.out.println("ok, process is running asynchronously");
}
}
private void runShellCommand(String cmd, int mode) throws IOException{
String prefix = "";
String osName = System.getProperty("os.name");
osName = osName.toLowerCase();
if (osName.indexOf("windows") != -1) {
if (osName.indexOf("95") != -1) {prefix = "command.com /c ";}
else if (osName.indexOf("98") != -1) {prefix = "command.com /c ";}
else if (osName.indexOf("xp") != -1) {prefix = "cmd.exe /c ";}
}
if (prefix.length() <= 0) {
System.out.println("unknown OS: don\'t know how to invoke shell");
} else {
runCommand(prefix + cmd, mode);
}
}
Starte ich mein EXE Programm mit
Code:
runShellCommand(System.getProperty("user.dir")+"/MeineEXE.exe",MODE_CATCHOUTPUT);
im Konstruktor meines JFrames dann dann startet dieses und steckt seinen Output und das JTextArea. Geht also prima.
Problem ist nun folgendes:
Das EXE-Programm soll per Button gestartet und beendet werden. Dazu habe ich per ActionPerformed-Methode dies hier gemacht:
Code:
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(connectButton)){
try {
runShellCommand(System.getProperty("user.dir")+"/MeineEXE.exe",MODE_CATCHOUTPUT);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
if (e.getSource().equals(disconnectButton)) {
connectButton.setEnabled(true);
disconnectButton.setEnabled(false);
textArea.append("\nDisconnecting...");
pr.destroy();
pr = null;
}
if (e.getSource().equals(exitButton)) {
pr.destroy();
rt.exit(1);
System.exit(0);
}
}
Der connectButton soll das Programm starten, der disconnectButton soll es beenden.
Starte ich jetzt mein EXE-Programm nicht per Konstruktor sondern per Button bleibt der Button gedrückt hängen und das Programm hängt und läuft nichtmehr weiter.
Ich habe bereits unterschiedliche Kombinationen ausprobier und auch mal ein anderes Programm starten lassen. Jedes mal das gleiche. Sobald ich per Button den Start aslöse hängt das Programm. Der Witz an der Geschichte ist: Das Programm wird geladen. Im Windows Taskmanager taucht es auf, nur hab ich keine Ausgabe und laufen tut es auch nicht. Zumindest macht es nicht das was es normalerweise machen sollte.
Zweites kleines Problem:
Starte ich die Exe wieder über den JFrame-Konstruktor und versuche es mit dem disconnectButton zu beenden tut sich da gar nix. Das Programm läuft lustig weiter.
Any Ideas ?
gruß
Alex