Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

я сделал как Ларс предложил и написал свой.

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

Приведенный ниже код находился в отдельном классе «Input», который имеет статическую строку «inString».

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

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

        return inString;
    }

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top