2008-09-26 11 views
5

Hola, he estado desarrollando una aplicación en la consola de Windows con Java, y quiero ponerla en línea en todos sus console-graphics-glory.Java - applet web similar a una consola

¿Hay una API de applet web sencilla que pueda usar para portar mi aplicación?

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

Creo que algo en esta línea sería una gran ventaja para cualquier desarrollador Java que quiera poner su trabajo en línea.

Respuesta

4

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

+0

Hecho, publicado el resultado a continuación. Gracias Lars! –

0

Recuerdo la implementación del applet cliente de telnet hace unos años (cuando las personas usaban telnet). Quizás podrías desenterrarlos y modificarlos.

0

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

Entonces estás bastante ordenado. Un applet. Agregue un TextArea (o equivalente). Adjuntar salida al área de texto. Escribir golpes de tecla a la entrada. Trabajo hecho.

+0

Solo uso System.in y System.out en mi contenedor IO class - Así que eso no llevará demasiado tiempo. Supongo que la respuesta es solo usar un TextArea. ¡Gracias! –

3

Como primer ejemplo de una aplicación de estilo cnsole gloriosa e increíblemente útil, consulte goosh, el Google Shell. No puedo imaginarme navegando por la Red sin más.

Concedido, no hay un código fuente, pero puede obtener un poco de su magia usando Firebug más o menos.

Usar un TextArea podría ser un enfoque propenso a errores. Recuerde que tendrá que hacer tanto la entrada como la salida a este TextArea y que debe realizar un seguimiento de la posición del cursor. Yo sugeriría que, si realmente haces este enfoque, abstraes sobre un campo de texto simple (¿herencia, quizás?) Y usas un componente que tiene, por ejemplo, un prompt() para mostrar el mensaje y habilitar la entrada y también sigue la abstracción de shell habitual de tener stdin (un InputStream, que lee desde el prompt, pero puede vincularse, digamos archivos) y stdout y posiblemente stderr, OutputStreams, vinculado al texto de TextArea.

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

4

Hice como Lars sugiero y escribí el mío.

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 "inString" cadena estática.

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

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

     return inString; 
    } 

través de salida de la vida útil del proyecto que probablemente mantener este código un poco más, pero en este momento - que funciona :)

Cuestiones relacionadas