Question

Hé, je développe une application dans la console Windows avec Java et je souhaite la mettre en ligne dans toute la gloire de sa console.

Existe-t-il une API simple d'applet Web que je peux utiliser pour transférer mon application?

J'utilise uniquement les fonctionnalités de base de System.out et System.in, mais je suis heureux de reconstruire mes wrappers d'E / S.

Je pense qu'une solution dans ce sens serait un atout majeur pour tout développeur Java débutant qui souhaite mettre son travail en ligne.

Était-ce utile?

La solution

Bien sûr, créez simplement une applet, mettez-y une petite interface utilisateur avec un JFrame avec deux composants: l’un pour l’écriture de la sortie et l’autre pour la saisie des entrées. Incorporer l'applet dans la page.

Autres conseils

J'ai fait ce que Lars a écrit et écrit moi-même.

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();
    }
}

Le code ci-dessous appartenait à une classe distincte "Entrée", qui possède une valeur statique "inString". chaîne.

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

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

        return inString;
    }

Tout au long de la durée de vie du projet, je maintiendrai probablement ce code un peu plus, mais à ce stade - cela fonctionne:)

En tant qu'exemple par excellence d'une webapp glorieuse et incroyablement utile, veuillez consulter goosh , le shell de Google. Je ne peux plus imaginer naviguer sur Internet sans lui.

Certes, il n'y a pas de code source, mais vous pourriez en tirer un peu de magie en utilisant Firebug ou autre.

Utiliser un objet TextArea peut être une approche sujette aux bogues. N'oubliez pas que vous devez faire les entrées et les sorties dans cette zone de texte et que vous devez donc garder une trace de la position du curseur. Je suggérerais que, si vous faites vraiment cette approche, abstenez-vous au-dessus d’une simple TextArea (héritage, peut-être?) Et utilisez-vous un composant qui, par exemple, une invite () pour afficher l'invite et permettre une entrée; elle suit également l'abstraction de shell habituelle consistant à avoir stdin (un InputStream, qui lit à partir de l'invite, mais peut être lié par exemple, fichiers). Et stdout et éventuellement stderr , OutputStreams, lié au texte de TextArea.

Ce n'est pas une tâche facile et je ne connais aucune bibliothèque pour le faire.

Je me souviens avoir vu la mise en œuvre d’un applet client telnet telnet il ya environ des années (à l’époque où les gens utilisaient telnet). Peut-être pourriez-vous les extraire et les modifier.

System.out et System.in sont statiques et donc diaboliques. Vous devrez passer par votre programme en les remplaçant par des non-statiques ("paramétrer à partir de ci-dessus"). Depuis une applet, vous ne pouvez pas utiliser System.setOut / setErr / setIn.

Ensuite, vous êtes à peu près triés. Une applet Ajoutez une zone de texte (ou équivalente). Ajouter la sortie à la zone de texte. Ecrivez des touches dans l’entrée. Travail accompli.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top