support - Java: applet web similar a una consola
java web start chrome (5)
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.
Oye, he estado desarrollando una aplicación en la consola de Windows con Java, y quiero ponerla en línea en todas sus consolas-gráficos-gloria.
¿Existe una API de applet web simple que pueda usar para portar mi aplicación?
Solo estoy usando la funcionalidad básica de 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 en línea su trabajo.
Recuerdo la implementación de applets de los clientes de telnet hace unos años (cuando las personas usaban telnet). Quizás podrías desenterrarlos y modificarlos.
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.
Como primer ejemplo de una aplicación de Internet gloriosa e increíblemente útil, vea goosh , el Google Shell. No puedo imaginarme navegando por la Red sin más.
De acuerdo, no hay un código fuente, pero puedes 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 hace este enfoque, abstraiga en un área de texto simple (¿herencia, tal vez?) Y use un componente que tenga, por ejemplo, un prompt()
para mostrar el mensaje y habilitar la entrada y también siga el habitual shell abstracción de tener stdin
(un InputStream, que lee desde el prompt, pero puede ser vinculado a, digamos archivos, más o menos) y stdout
y posiblemente stderr
, OutputStreams, vinculados al texto del TextArea.
No es una tarea fácil, y no sé de ninguna biblioteca para hacerlo.
Hice lo que Lars sugirió y escribió 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 a continuación estaba en una clase separada, "Entrada", que tiene una cadena estática "inString".
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 del proyecto, probablemente mantendré este código un poco más, pero en este punto, funciona :)