Pregunta

Hola, he estado desarrollando una aplicación en la consola de Windows con Java y quiero ponerla en línea en toda su consola-graphics-glory.

¿Existe una API de applet web simple que pueda usar para migrar mi aplicación?

Solo estoy usando la funcionalidad básica System.out y System.in, pero estoy feliz de reconstruir mis envoltorios de E / S.

Creo que algo en este sentido sería un gran activo para cualquier desarrollador de Java principiante que quiera poner su trabajo en línea.

¿Fue útil?

Solución

Claro, solo conviértalo en un applet, coloque una pequeña interfaz de usuario con un JFrame con dos componentes, uno para escribir la salida y otro para ingresar entradas. Incrustar el applet en la página.

Otros consejos

Hice lo que Lars escribí y escribí por mi cuenta.

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

Este código de abajo estaba en una clase separada, "entrada", que tiene una estática " inString " cadena.

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

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

        return inString;
    }

A lo largo de la vida útil del proyecto, probablemente mantendré este código un poco más, pero en este punto, funciona :)

Como ejemplo principal de una aplicación web gloriosa e increíblemente útil como cnsole, consulte goosh , el Shell de Google. No puedo imaginar navegar por la red sin ella.

Por supuesto, no hay ningún código fuente, pero podrías sacar un poco de su magia usando Firebug o algo así.

El uso de TextArea podría ser un enfoque propenso a errores. Recuerde que deberá realizar tanto la entrada como la salida en este Área de texto y que, por lo tanto, debe realizar un seguimiento de la posición del cursor. Sugeriría que, si realmente hace este enfoque, abstraiga una TextArea simple (¿herencia, tal vez?) Y use un componente que tenga, por ejemplo, un prompt () para mostrar el prompt y habilitar la entrada y también sigue la abstracción habitual del shell de tener stdin (un InputStream, que se lee desde el prompt, pero se puede enlazar a, digamos archivos o menos) y stdout y posiblemente stderr , OutputStreams, enlazados al texto de TextArea.

No es una tarea fácil, y no conozco ninguna biblioteca para hacerlo.

Recuerdo la aplicación del applet del cliente telnet visto hace unos años (cuando la gente usaba telnet). Tal vez podrías desenterrarlos y modificarlos.

System.out y System.in son estáticos y por lo tanto malvados. Deberá pasar por su programa reemplazándolos con no estáticos (" parametrizar desde arriba "). Desde un applet no puedes usar System.setOut / setErr / setIn.

Entonces estás bastante ordenado. Un applet. Añadir una TextArea (o equivalente). Adjuntar salida al área de texto. Escribir pulsaciones de teclas en la entrada. Trabajo hecho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top