Steffen P.: GUI fuer Commandozeile

Hallo,

gleich vorweg, ich bin blutiger Anfänger mit Java, allerdings moechte ich mich nun nach und nach in Java einarbeiten. Trotzdem wuerde ich gerne wissen, ob es vielleicht eine Art Muster gibt. an der ich mich fuer meine erste Aufgabe "entlanghangeln" kann. Und zwar moechte ich eine klein grafische Oberfläche gestalten, die einen Kommandozeilenbefehl durchführt. Z.Z. nutze ich immer noch die Konsole um etwas umzuwandeln. Das soll aber durch eine einfach e Oberfläche ersetzt werden. Also Befehl lautet etwa wie folgt:

java -jar something.jar -xfile2 -yfile1 konstante -cfile4 variable=X-Wert zweitevariable=Y-Wert -zresultfile

Ich würde nun gerne dies in ein GUI bringen, und zwar soll man auswählen können, in welchem Verzeichnis something.jar befindet, und zudem soll man noch auswählen können, wo file1, file2 usw. abgelegt ist, dabei kann file2 auch eine URL Adresse darstellen. Zudem bräuchte ich noch zwei Felder, wo man die Werte für Y-Wert und X-Wert eingeben kann und es muss auch das Verzeichnis auswählbar sein, in welches das resultfile abgelegt werden soll. Ist eigentlich bestimmt ziemlich einfach, aber wie gesagt ich stehe am Anfang, gibt es vielleicht irgendwo gute Tutorials oder Beispiel, die diese Aufgaben lösen?

Beste Grüße, Steffen

  1. Hallo Steffen,

    gleich vorweg, ich bin blutiger Anfänger mit Java, allerdings moechte ich mich nun nach und nach in Java einarbeiten. Trotzdem wuerde ich gerne wissen, ob es vielleicht eine Art Muster gibt. an der ich mich fuer meine erste Aufgabe "entlanghangeln" kann. Und zwar moechte ich eine klein grafische Oberfläche gestalten, die einen Kommandozeilenbefehl durchführt. Z.Z. nutze ich immer noch die Konsole um etwas umzuwandeln. Das soll aber durch eine einfach e Oberfläche ersetzt werden. Also Befehl lautet etwa wie folgt:

    java -jar something.jar -xfile2 -yfile1 konstante -cfile4 variable=X-Wert zweitevariable=Y-Wert -zresultfile

    Ich würde nun gerne dies in ein GUI bringen, und zwar soll man auswählen können, in welchem Verzeichnis something.jar befindet, und zudem soll man noch auswählen können, wo file1, file2 usw. abgelegt ist, dabei kann file2 auch eine URL Adresse darstellen. Zudem bräuchte ich noch zwei Felder, wo man die Werte für Y-Wert und X-Wert eingeben kann und es muss auch das Verzeichnis auswählbar sein, in welches das resultfile abgelegt werden soll. Ist eigentlich bestimmt ziemlich einfach, aber wie gesagt ich stehe am Anfang, gibt es vielleicht irgendwo gute Tutorials oder Beispiel, die diese Aufgaben lösen?

    Um ein GUI zu erstellen, könntest du dich beispielsweise in das Kapitel 14 ("Grafikprogrammierung mit dem AWT") des Buches Java ist auch eine Insel einarbeiten. Swing ist dabei das Stichwort. Um ein Fenster zu erzeugen, bietet sich die Klasse JFrame an. Außerdem für dich eventuell (sehr wahrscheinlich) brauchbar: JPanel, JLabel, JTextField, JCheckBox, JButton und vermutlich noch mehr - die du natürlich alle in der offiziellen Dokumentation wiederfindest, beispielsweise der Java 1.5.0 API.

    Um ein Kommando von Java aus auszuführen wirst du eine entsprechende Methode benötigen, z. B. die Methode exec(String[] cmdarray, String[] envp, File dir) des Runtime-Objekts.
    Um Beispielsweise den Befehl
    cp pfad1 pfad2
    auszuführen, rufst du folgenden Code auf (natürlich kommt da noch etwas Pipapo drumrum):

      
    Process child = Runtime.getRuntime().exec(new String[] {"cp", "pfad1", "pfad2"}, null, null);
    

    Der Vorteil dieser Methode ist unter anderem, dass die Argumente Leerzeichen enthalten dürfen (z. B. bei Pfaden mit Leerzeichen).
    Weitere Beispiele findest du unter anderem auf http://javaalmanac.com/, wenn du dort nach "exec" suchst.
    Insbesondere noch interessant: Reading Output from a Command - oftmals möchte man die Ausgabe eines Kommandos abfangen. Man beachte, dass hier nur der InputStream - und nicht der ErrorStream - abgefangen wird. Der ErrorStream muss gesondert abgefangen werden.

    Und zu guter Letzt noch etwas Code, den ich damals extra für diesen Zweck geschrieben habe:

      
            /**  
             * Execute a specific command.  
             *  
             * @param  cmdarray          The command (with arguments) that will be executed.  
             * @param  workingDirectory  The working directory in that the command will be executed.  
             */  
            private static void exec(String[] cmdarray, File workingDirectory) {  
                    try {  
      
                            Process child = Runtime.getRuntime().exec(cmdarray, null, workingDirectory);  
      
                            int c;  
                            InputStream in;  
      
                            // Get the input stream and read from it  
                            in = child.getInputStream();  
                            while ((c = in.read()) != -1) {  
                                    System.out.print((char) c);  
                            }  
                            in.close();  
      
                            // Get the error stream and read from it  
                            in = child.getErrorStream();  
                            while ((c = in.read()) != -1) {  
                                    System.out.print((char) c);  
                            }  
                            in.close();  
      
                            // wait for the process to exit  
                            child.waitFor();  
      
                            if (child.exitValue() != 0) {  
                                    System.err.println("\nError: Process returned error code. Command was:");  
                                    for (int i = 0; i < cmdarray.length; i++) {  
                                            System.err.print(cmdarray[i]);  
                                            if (i < cmdarray.length - 1) {  
                                                    System.err.print(" ");  
                                            }  
                                    }  
                                    System.err.println();  
                                    System.exit(1);  
                            }  
      
                    } catch (Exception e) {  
                            e.printStackTrace();  
                            System.exit(1);  
                    }  
            }  
    
    

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    1. Hallo Marc,

      Menge Holz fuer mich, danke dir aber erst einmal fuer die Umsetzungsstichpunkte. Nur eine Frage noch kurz angehangen. Das Ergebnis des Batch-Befehls sind mehrere Dateien inklusive Unterverzeichnisse, diese muessen dann noch in ein jar File gepackte werden und diese gepackte Datei muss sodann noch eine Umbenennung der Dateiendung von 'jar' in eine andere spezifische Dateieindung bekommen und am Ende soll diese Datei noch "geöffnet" also auf dem System ausgeführt werden. Ist das auch realisierbar, sozusagen dass das Swing GUI noch so lange erscheint, bis die Datei dann geöffnet wird?

      Gruß Steffen, Vielen Dank nochmal für den Code hat mich schon eine Menge voran gebracht.

      1. Hallo Steffen,

        Menge Holz fuer mich, danke dir aber erst einmal fuer die Umsetzungsstichpunkte. Nur eine Frage noch kurz angehangen. Das Ergebnis des Batch-Befehls sind mehrere Dateien inklusive Unterverzeichnisse, diese muessen dann noch in ein jar File gepackte werden und diese gepackte Datei muss sodann noch eine Umbenennung der Dateiendung von 'jar' in eine andere spezifische Dateieindung bekommen und am Ende soll diese Datei noch "geöffnet" also auf dem System ausgeführt werden. Ist das auch realisierbar, sozusagen dass das Swing GUI noch so lange erscheint, bis die Datei dann geöffnet wird?

        Aber natürlich! Du brauchst die Java Anwendung nur entsprechend zu programmieren. Java kann auch ZIP-Dateien erstellen (JAR-Dateien sind ZIP-Dateien) - ein Beispiel findet sich wieder ebenfalls auf Java Almanac:
        Creating a ZIP File

        Danach führst du den entsprechenden Befehl auf die fertige Datei aus - ganz so, wie du es haben willst.

        Bei konkreten Problemen kannst du diese ja nochmals hier im Forum erwähnen (in diesem Thread, sofern er bis dahin noch nicht ins Archiv gewandert ist).

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)