Java — консольный веб-апплет [закрыт]

Эй, я разрабатываю приложение для консоли Windows с помощью Java и хочу выложить его в сеть во всей красе консольной графики.

Есть ли простой API веб-апплета, который я могу использовать для переноса своего приложения?

Я просто использую базовые функции System.out и System.in, но я рад перестроить свои оболочки ввода-вывода.

Я думаю, что что-то в этом роде было бы большим подспорьем для любых начинающих Java-разработчиков, которые хотят разместить свою работу в Интернете.


person Dean Rather    schedule 26.09.2008    source источник


Ответы (5)


Конечно, просто создайте апплет, поместите на него небольшой пользовательский интерфейс Swing с JFrame с двумя компонентами: один для записи вывода и один для ввода входных данных. Вставьте апплет на страницу.

person Lars Westergren    schedule 26.09.2008

Я сделал так, как предложил Ларс, и написал свой собственный.

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

Этот код ниже был в отдельном классе «Ввод», который имеет статическую строку «inString».

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

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

        return inString;
    }

На протяжении всего жизненного цикла проекта я, вероятно, буду поддерживать этот код еще некоторое время, но на данный момент он работает :)

person Dean Rather    schedule 09.10.2008

В качестве главного примера великолепного и невероятно полезного веб-приложения, похожего на cnsole, см. goosh, Google Shell. Я не могу представить работу в сети без него.

Конечно, исходного кода нет, но вы можете получить немного его волшебства, используя Firebug или что-то в этом роде.

Использование TextArea может быть подвержено ошибкам. Помните, что вам нужно будет выполнять как ввод, так и вывод в эту TextArea, и поэтому вы должны отслеживать положение курсора. Я бы посоветовал, если вы действительно используете этот подход, вы абстрагировались от простого TextArea (может быть, наследование?) и использовали компонент, который, например. prompt() для отображения подсказки и включения ввода, а также следует обычной абстракции оболочки с наличием stdin (InputStream, который считывает из подсказки, но может быть привязан, скажем, к файлам или около того) и stdout и, возможно, stderr, OutputStreams, привязан к тексту TextArea.

Это непростая задача, и я не знаю ни одной библиотеки для этого.

person Aleksandar Dimitrov    schedule 27.09.2008

Я помню, как несколько лет назад видел реализацию клиентского апплета telnet (когда люди использовали telnet). Может быть, вы могли бы выкопать их и изменить их.

person skaffman    schedule 26.09.2008

System.out и System.in — это статика и, следовательно, зло. Вам нужно будет пройти через свою программу, заменив их нестатическими ("параметризовать сверху"). Из апплета нельзя использовать System.setOut/setErr/setIn.

Тогда вы в значительной степени отсортированы. Апплет. Добавьте TextArea (или эквивалент). Добавьте вывод в текстовую область. Запишите нажатия клавиш на вход. Работа выполнена.

person Tom Hawtin - tackline    schedule 26.09.2008
comment
Я использую только System.in и System.out в своей оболочке класса ввода-вывода, так что это не займет много времени. Поэтому я полагаю, что ответ заключается в том, чтобы просто использовать TextArea. Спасибо! - person Dean Rather; 29.09.2008