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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top