Eigene CMD GUI zum Starten von JAR

Hallo Community.

Zurzeit habe ich ein kleines Projekt und hänge an einer Stelle. Da habe ich mir gedacht, ich meld mich hier mal an und frag nach. Ich habe schon viel Zeit in Suchen investiert und nur teilweise Ergebnisse gefunden, falls jedoch noch ähnliche Beiträge rum sind, wäre es sehr nett diese hier zu verlinken.

Und ich weiß nicht ob ich dieses Thema in das richtige Unterforum gepostet habe. Ansonsten bitte verschieben.

Mein Problem:
Ich möchte gerne eine GUI machen welche ähnlich der CMD-Konsole aussschaut. Mit dieser GUI möchte ich dann andere JAR-Dateien laden.

Der Code für das umleiten der Input/Output-Streams sowie der GUI ist von hier.
Der Code:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.concurrent.Executors;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class JCLGUI extends JFrame {

	private static final long serialVersionUID = -2161140285398426243L;
	JTextArea txtConsole;
    JTextField txtCommand;
 
    public JCLGUI() {
        super("JavaCommandLineWrapperExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
 
        txtConsole = new JTextArea(20, 80);
        txtConsole.setBackground(Color.BLACK);
        txtConsole.setForeground(Color.WHITE);
        txtConsole.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
        txtConsole.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                txtCommand.requestFocus();
                txtCommand.dispatchEvent(e);
            }
        });
        txtCommand = new JTextField(80);
        txtCommand.setBackground(Color.BLACK);
        txtCommand.setForeground(Color.WHITE);
        txtCommand.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
 
        txtConsole.setEditable(false);
 
        JScrollPane scrollPane = new JScrollPane(txtConsole);
 
        add(scrollPane);
        add(txtCommand, BorderLayout.SOUTH);
 
        setSize(900, 400);
        setVisible(true);
        txtCommand.requestFocus();
 
        startShell();
    }
 
    void startShell() {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe")
                .redirectErrorStream(true);
 
        try {
            final Process process = processBuilder.start();
            final PrintWriter processInput = new PrintWriter(process
                    .getOutputStream());
            captureProcessOutput(process);
            txtCommand.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    processInput.println(txtCommand.getText());
                    processInput.flush();
                    txtCommand.setText("");
                }
            });
 
            int exitCode = process.waitFor();
            System.exit(exitCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    void captureProcessOutput(final Process process) {
        Executors.newSingleThreadExecutor().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    char c = (char) -1;
                    InputStream processOutput = process.getInputStream();
                    while ((c = (char) processOutput.read()) != -1) {
                        if ((byte) c == 12) {
                            /*
                             * der Byte-Code, der gesendet wird, wenn der
                             * Bildschirm gelöscht werden soll, in cmd.exe der
                             * Befehl "cls"
                             */
                            txtConsole.setText("");
                        } else {
                            // String s = Character.toString(c);
                            // txtConsole.append(new
                            // String(s.getBytes("CP1225")));
                            txtConsole.append(String.valueOf(c));
                        }
                        txtConsole.setCaretPosition(txtConsole.getText()
                                .length());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
 
    public static void main(String[] args) throws Exception {
        new JCLGUI();
 
    }
}

Funktioniert ganz gut. Da die auszuführende JAR jedoch Dateien braucht die im selben Ordner liegen muss ich zuerst mit "cd" den Pfad ändern. Geht auch. Die JAR lässt sich mit "java -jar test.jar" auch starten jedoch kann ich keine Eingaben in der JAR machen. Bei der in diesem Fall auszuführenden JAR handelt es sich um die CraftBukkit.jar welche für Minecraft-Server gemacht wurde. Diese empfängt meine Befehle nicht. Jedoch ein einfacher Taschenrechner, gemacht mit Scannern, funktioniert.

Kann mir hier jemand helfen?

Gruß PNGamingPower
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Du musst, ähnlich zur Ausgabe,
Code:
Process.getOutputStream()
nehmen und an den deine Eingaben senden.
 
Da ich den Code nur teilweise verstehe, weiß ich jetzt nicht genau wie ich vorgehen muss.
Könntest du mir vielleicht auch den Code den ich kopiert habe erklären bzw. wie ich das implementieren kann, dass die Eingaben auch ankommen?

EDIT:
Ich hab mir den Code nochmal angeschaut und etwas gegoogelt.
Jedoch weiß ich immer noch nicht wie ich das lösen kann.

@KrokoDiehl
Wo müsste ich das dann einbauen?
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Ok, ich war etwas zu voreilig. Es wird tatsächlich schon etwas an den externen Prozess (cmd.exe) gesenden, und zwar das was du in das Textfeld schreibst.
Sieht soweit ok aus, also sollte es funktionieren.

Zur (Kurz-)Erklärung des geposteten Codes:

JCLGUI() - Baut die GUI auf: Eine TextArea in das die Ausgabe des Prozesses geschrieben werden und ein TextField in das man selbst Befehle an den Prozess schreiben kann.

startShell() - Startet den externen Prozess (cmd.exe), und "hängt" sich an die Ausgabeströme. Das Senden an den Prozess wird in dem ActionListener gemacht.

captureProcessOutput() - Startet einen Thread der auf die Ausgaben des Prozesses lauscht und diese dann in die TextArea schreibt.
 
Danke für die Erklärung.

Jedoch frag ich mich immernoch warum ich keine Befehle an die JAR schicken kann.
Ich schau mal in den Quellcode der JAR woran das liegen könnte.

Gruß PNGamingPower
 

bERt0r

Top Contributor
Ich glaube das ansprechen der In/Outputstreams von cmd funktioniert nicht rightig, da hats schon einige Threads darüber gegeben afaik. Hast du schon mal probiert das jar direkt zu starten - also die java.exe aufzurufen?
 
Es ist so, dass man die JAR nur mithilfe eines bat Befehls starten kann.it dem simplen "java -jar craftbukkit.jar". Hast du das gemeint?

EDIT:
Dass stimmt so nicht. Es ist wahrscheinlich ein Manifest hinterlegt, jedoch beim Doppelklick wird dann ein javaw.exe Prozess gestartet. Jedoch ist dies eine reine Konsolenanwendung!
 
Zuletzt bearbeitet:
Abend miteinander.

Ich habe mir den Source mal angeschaut und herausgefunden, dass die einen eigenen ConsoleReader haben. Dass wird dann wohl der Grund sein warum ich keine Eingaben machen kann.

Selber lösen kann ich dieses Problem leider nicht, da ich den Source-Code nicht genug verstehe als dass ich meinen Code darauf umändern könnte (habe mit den Streams noch nicht so viel gearbeitet).

Vielleicht kann mir ja jemand von euch eine Lösung geben. Hier ist der Link zum ConsoleReader (denke mal dass das derjenige ist): ConsoleReader

Hier ab Zeile 86 wird er dann angewandt.

Hoffe jemand kann mir da helfen. Bin wie gesagt unerfahren im Bereich der Streams :)

Gruß PNGamingPower
 
Es hat sich erledigt.

Habs selber hinbekommen. Hab mir einfach ein Plugin gemacht welches mir den System.in der craftbukkit.jar ausliest (BufferedReader) und jetzt klappts.

Trotzdem danke an alle.

Thema kann geschlossen werden.

Gruß PNGamingPower
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Border für Buttons AWT, Swing, JavaFX & SWT 19
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
C ISelectionProvider und eigene Selections AWT, Swing, JavaFX & SWT 2
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben