Java - Applet web simile a una console [chiuso]
Domanda
Ehi, ho sviluppato un'applicazione nella console di Windows con Java e voglio metterla online in tutta la sua gloria-grafica-console.
Esiste una semplice API dell'applet Web che posso utilizzare per il porting della mia app?
Sto solo usando le funzionalità di base System.out e System.in, ma sono felice di ricostruire i miei wrapper I / O.
Penso che qualcosa del genere sarebbe una grande risorsa per tutti gli sviluppatori Java che vogliono mettere online il loro lavoro.
Soluzione
Certo, basta trasformarlo in un'applet, inserirvi una piccola interfaccia utente swing con un JFrame con due componenti: uno per la scrittura dell'output e uno per l'immissione degli input da. Incorporare l'applet nella pagina.
Altri suggerimenti
Ho fatto come Lars suggerito e scritto il mio.
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();
}
}
Questo codice di seguito era in una classe separata, "Input", che ha un "inString" statico; stringa.
public static String getString() {
inString = "";
// Wait for input
while (inString == "") {
try{
Thread.sleep(100);
} catch (Exception e) {}
}
return inString;
}
Per tutta la durata del progetto probabilmente manterrò questo codice ancora un po ', ma a questo punto - funziona :)
Come esempio principale di una webapp gloriosa e incredibilmente utile simile a cnsole, vedi goosh , la Shell di Google. Non riesco più a immaginare di navigare in Internet senza di essa.
Concesso, non esiste un codice sorgente, ma potresti ottenere un po 'della sua magia usando Firebug o giù di lì.
L'uso di un TextArea potrebbe essere un approccio soggetto a bug. Ricorda che dovrai fare sia input che output su questo TextArea e che devi quindi tenere traccia della posizione del cursore. Suggerirei che, se segui davvero questo approccio, ti allontani da un semplice TextArea (eredità, forse?) E usi un componente che ha, ad es. un prompt ()
per mostrare il prompt e abilitare l'input e a segue anche la solita astrazione della shell con stdin
(un InputStream, che legge dal prompt, ma può essere associato per esempio, diciamo file) e stdout
e possibilmente stderr
, OutputStreams, associati al testo di TextArea.
Non è un compito facile e non conosco nessuna libreria per farlo.
Ricordo di aver visto l'implementazione dell'applet client telnet circa anni fa (quando le persone usavano telnet). Forse potresti scavarli e modificarli.
System.out e System.in sono statici e quindi malvagi. Dovrai passare attraverso il tuo programma sostituendoli con valori non statici ("parametro dal di sopra"). Da un'applet non è possibile utilizzare System.setOut / setErr / setIn.
Quindi sei praticamente ordinato. Un'applet. Aggiungi un TextArea (o equivalente). Aggiungi output all'area di testo. Scrivi i tasti premuti sull'input. Lavoro fatto.