Java — консольный веб-апплет [закрыто]
Вопрос
Привет, я разрабатывал приложение для консоли 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 (или эквивалент).Добавьте вывод в текстовую область.Запишите нажатия клавиш на вход.Дело сделано.