Frage

Hey, ich habe in der Windows-Konsole mit Java eine Anwendung zu entwickeln, und will es in all seinem Konsole-graphics-Ruhm online stellen.

Gibt es eine einfache Web-Applet API ich zu portieren meine app über verwenden kann?

Ich bin nur grundlegende System.out und System.in Funktionalität, aber ich bin glücklich, meinen E / A-Wrapper wieder aufzubauen.

Ich denke, etwas in diese Richtung eine große Bereicherung für jeden Anfang Java-Entwickler, die ihre Arbeit wollen würde online stellen.

War es hilfreich?

Lösung

Sicher, einfach in ein Applet, legt eine kleine Schaukel UI auf sie mit einem JFrame mit zwei Komponenten - einem für das Schreiben von Ausgabe und einer für die Eingabe von Eingaben aus. Einbetten des Applets auf der Seite.

Andere Tipps

Ich tat, wie Lars vorgeschlagen und schrieb meine eigenen.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.awt.Font;

public class Applet extends JFrame {
    static final long serialVersionUID = 1;

    /** Text area for console output. */
    protected JTextArea textArea;

    /** Text box for user input. */
    protected JTextField textBox;

    /** "GO" button, in case they don't know to hit enter. */
    protected JButton goButton;

    protected PrintStream printStream;
    protected BufferedReader bufferedReader;

    /**
     * This function is called when they hit ENTER or click GO.
     */
    ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
            goButton.setEnabled(false);
            SwingUtilities.invokeLater(
                new Thread() {
                    public void run() {
                        String userInput = textBox.getText();
                        printStream.println("> "+userInput);
                        Input.inString = userInput;
                        textBox.setText("");
                        goButton.setEnabled(true);
                    }
                }   
            );
        }
    };

    public void println(final String string) {
        SwingUtilities.invokeLater(
            new Thread() {
                public void run() {
                    printStream.println(string);
                }
            }   
        );
    }

    public void printmsg(final String string) {
        SwingUtilities.invokeLater(
            new Thread() {
                public void run() {
                    printStream.print(string);
                }
            }   
        );
    }

    public Applet() throws IOException {
        super("My Applet Title");

        Container contentPane = getContentPane();

        textArea = new JTextArea(30, 60);
        JScrollPane jScrollPane = new JScrollPane(textArea);
        final JScrollBar jScrollBar = jScrollPane.getVerticalScrollBar();
        contentPane.add(BorderLayout.NORTH, jScrollPane);
        textArea.setFocusable(false);
        textArea.setAutoscrolls(true);
        textArea.setFont(new Font("Comic Sans MS", Font.TRUETYPE_FONT, 14));

        // TODO This might be overkill
        new Thread() {
            public void run() {
                while(true) {
                    jScrollBar.setValue(jScrollBar.getMaximum());
                    try{
                        Thread.sleep(100);
                    } catch (Exception e) {}
                }
            }
        }.start();

        JPanel panel;
        contentPane.add(BorderLayout.CENTER, panel = new JPanel());

        panel.add(textBox = new JTextField(55));
        textBox.addActionListener(actionListener);

        panel.add(goButton = new JButton("GO"));
        goButton.addActionListener(actionListener);

        pack();

        // End of GUI stuff

        PipedInputStream inputStream;
        PipedOutputStream outputStream;

        inputStream = new PipedInputStream();
        outputStream = new PipedOutputStream(inputStream);

        bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "ISO8859_1"));
        printStream = new PrintStream(outputStream);

        new Thread() {
            public void run() {
                try {
                    String line;
                    while ((line = bufferedReader.readLine()) != null) {
                        textArea.append(line+"\n");
                    }
                } catch (IOException ioException) {
                    textArea.append("ERROR");
                }
            }
        }.start();
    }
}

Dieser Code unten war in einer separaten Klasse, "Input", die eine statische "inString" string hat.

    public static String getString() {
        inString = "";

        // Wait for input
        while (inString == "") {
            try{
                Thread.sleep(100);
            } catch (Exception e) {}
        }

        return inString;
    }

Durch-out die Lebensdauer des Projekts werde ich wohl diesen Code halten einige mehr, aber an diesem Punkt - es funktioniert:)

Als premier Beispiel einer glorreichen und unglaublich nützlich cnsole artigen Webapp finden Sie goosh , die Google Shell. Ich kann nicht mehr ohne das Netz vorstellen Surfen.

Zugegeben, es gibt keinen Quellcode, aber Sie könnten mithilfe von Firebug ein wenig von seinem Zauber raus oder so.

Mit einem TextArea- könnte ein Fehler anfällig Ansatz. Denken Sie daran, dass Sie sowohl die Ein- und Ausgabe dieser TextArea- tun müssen, und dass Sie so den Überblick über Cursor-Position halten muss. Ich würde vorschlagen, dass, wenn Sie auch wirklich diesen Ansatz tun, Sie abstrahieren über eine Ebene TextArea- (Vererbung, vielleicht?) Und eine Komponente verwenden, die hat, z.B. ein prompt() die Aufforderung zu zeigen und Enable-Eingang und eine folgt auch die übliche Shell Abstraktion stdin von (einem Inputstream, die von der Eingabeaufforderung liest, kann aber zu gebunden werden, lassen Sie sich Dateien sagen oder so) und stdout und möglicherweise stderr, OutputStreams, gebunden an den Text des TextArea-.

Es ist keine leichte Aufgabe, und ich weiß nicht, von jeder Bibliothek, es zu tun.

I seenig Telnet-Client-Applet implementationa um vor Jahren erinnern (zurück, wenn die Menschen verwendet telnet). Vielleicht sie könnten Sie graben und sie ändern.

System.out und System.in sind Statik und damit das Böse. Sie müssen durch das Programm gehen, um sie mit nicht-Statik ( „parametrisieren von oben“) zu ersetzen. Von einem Applet können Sie nicht System.setOut / setErr / SetIn verwenden.

Dann bist du ziemlich viel sortiert. Ein Applet. Fügen Sie eine Textarea (oder gleichwertig). Anfügen Ausgabe an den Textbereich. Schreiben Sie Tastenanschläge an den Eingang. Job gemacht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top