4 Stimmen

Wie startet man eine .exe-Datei durch Anklicken eines JButtons in der GUI?

Ich habe einen JFrame mit 3 Jbuttons erstellt. Ich möchte, dass die Schaltflächen verschiedene .exe-Dateien starten, die sich im selben Ordner befinden. Ist dies möglich? Wenn ja, was sollte ich für den actionListener schreiben? Ist es andererseits möglich, anstelle des Starts einer Exe-Datei eine Hauptklasse mit einem JButton zu starten? Wenn ja, was sollte ich für den actionListener schreiben?

Hinweis: Die .exe-Datei wird aus einem Java-Hauptprogramm erstellt.

JButton button1 = new JButton("Program1"); //The JButton name.
frame.add(button1); //Add the button to the JFrame.
button1.addActionListener().... // how to launch the .exe file

Vielen Dank im Voraus

4voto

camickr Punkte 315810
Runtime.getRuntime().exec( ... );

oder verwenden Sie die ProcessBuilder-Klasse.

Sie sollten in der Lage sein, Beispiele im Internet zu finden, die diese Klassen verwenden.

Edit: Um die Notepad-Exe unter Windows zu starten, könnte man zum Beispiel folgendes tun:

Process process = Runtime.getRuntime().exec( "cmd.exe /C start notepad" );

Wenn Sie eine Klasse ausführen wollen, müssen Sie die JVM auf die gleiche Weise aufrufen, wie Sie es von der Befehlszeile aus tun würden.

1voto

Zach L Punkte 15742

Vielleicht interessieren Sie sich für folgende Themen Ausführen eines externen Prozesses .

Dies würde entweder erfordern Runtime.getRuntime().exec oder das neuere ProcessBuilder

1voto

Ich denke, dass Sie Runtime.exec() oder einen ProcessBuilder verwenden würden, ähnlich wie Sie ein exe-Programm aufrufen würden, wenn Sie es nicht von einer GUI aufrufen. Einige Dinge, die man beachten sollte, sind, dass man Runtime.exec() wahrscheinlich in einem Hintergrund-Thread abseits des Swing-Hauptthreads, dem EDT, aufrufen möchte, wie z.B. durch ein SwingWorker-Objekt. Andernfalls könnte Ihre GUI einfrieren, während das Exe-Programm den Swing-Thread übernimmt. Sie sollten auch alle Warnungen über den Aufruf von Runtime.exec() beachten, die in diesem großartigen Artikel aufgeführt sind, Wenn Runtime.exec() nicht funktioniert möglicherweise einer der besten Artikel, die zu diesem Thema geschrieben wurden - sehr empfehlenswert!

Frage: Was meinen Sie mit dieser Aussage, da sie mir nicht klar ist?

Hinweis: Die Datei program.exe wird aus einem Java-Hauptprogramm erstellt.

1voto

Manidip Sengupta Punkte 3473

Hier ist eine alternative Antwort, ohne einen neuen Prozess durch Runtime.getRuntime().exec(...) zu erstellen - und Sie können auch Ihre System.in/out-Kanäle beibehalten. Wie auch immer, wenn Sie neu in der Welt der Java-Programmierung sind und versuchen, die Grundlagen zu erlernen, würde ich vorschlagen, dem Rat von camickr zu folgen und sich nicht mit dem ClassLoader herumzuschlagen, wie unten beschrieben.

Ich gehe davon aus, dass die Klasse, die Sie ausführen müssen, in sich geschlossen ist (keine inneren Klassen verwendet) und sich nicht bereits in Ihrem Klassenpfad oder Ihrer Jarfile befindet, so dass Sie einfach eine Instanz erstellen und deren main() aufrufen können. Wenn mehrere Klassendateien beteiligt sind, wiederholen Sie einfach die Methode für das Laden dieser Dateien.

Also, in der ActionListener, dass Ihr JButton addActionListener()-ed zu ...

public void actionPerformed (ActionEvent e) {
    String classNameToRun = e.getActionCommand(); // Or however you want to get it
    try {
        new MyClassLoader().getInstance(classNameToRun).main (null);
    } catch (ClassNotFoundException ce) {
        JOptionPane.showMessageDialog (null, "Sorry, Cannot load class "+classNameToRun,
                            "Your title", JOptionPane.ERROR_MESSAGE);
}}

Sie benötigen eine neue Klasse MyClassLoader, die sich bereits in Ihrem Klassenpfad befindet. Hier ist ein Pseudocode:

import java.io.*;
import java.security.*;

public class MyClassLoader extends ClassLoader {

        protected       String classDirectory = "dirOfClassFiles" + File.separator,
                                packageName = "packageNameOfClass.";

        /**
         * Given a classname, get contents of the class file and return it as a byte array.
         */

        private byte[] getBytes (String className) throws IOException {
                byte[] classBytes = null;
                File file = new File (classDirectory + className + ".class");

                // Find out length of the file and assign memory
                // Deal with FileNotFoundException if it is not there
                long len = file.length();
                classBytes = new byte[(int) len];

                // Open the file
                FileInputStream fin = new FileInputStream (file);

                // Read it into the array; if we don't get all, there's an error.
                // System.out.println ("Reading " + len + " bytes");
                int bCount = fin.read (classBytes);
                if (bCount != len)
                        throw new IOException ("Found "+bCount+" bytes, expecting "+len );

                // Don't forget to close the file!
                fin.close();
                // And finally return the file contents as an array
                return classBytes;
        }

        public Class loadClass (String className, boolean resolve)
                                                throws IOException, ClassNotFoundException,
                                                IllegalAccessException, InstantiationException {
                Class myClass = findLoadedClass (packageName + className);
                if (myClass != null)
                        return myClass;

                byte[] rawBytes = getBytes (className);
                myClass = defineClass (packageName + className,
                                                rawBytes, 0, rawBytes.length);
                // System.out.println ("Defined class " +packageName + className);
                if (myClass == null)
                        return myClass;
                if (resolve)
                        resolveClass (myClass);

                return myClass;
        }

        public Object getInstance (String className) throws ClassNotFoundException {
                try {
                        return loadClass (className, true).newInstance();
                } catch (InstantiationException inExp) {        inExp.printStackTrace();
                } catch (IllegalAccessException ilExp) {        ilExp.printStackTrace();
                } catch (IOException ioExp) {                   ioExp.printStackTrace();
                }
                return null;
        }
}

Anmerkungen: Dies funktioniert gut, wenn sich die Klasse, die Sie zu laden versuchen, auf Ihrem lokalen Rechner befindet und Sie Java von der Befehlszeile aus ausführen. Ich war nie erfolgreich bei dem Versuch, ein Applet dazu zu bringen, eine Klassendatei von einem Servlet herunterzuladen und zu laden - die Sicherheit lässt das nicht zu. In diesem Fall besteht die Abhilfe darin, ein anderes Applet in einem anderen Fenster auszuführen, aber das ist ein anderes Thema. Das oben beschriebene Laden von Klassen löst das Problem, dass man jede einzelne Klassendatei, die man vielleicht braucht, in ein Jar packen muss - nur um die GUI zu starten. Viel Glück, - M.S.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X