ねえ、私はJavaを使用してWindowsコンソールでアプリケーションを開発していて、そのすべてのconsole-graphics-gloryでオンラインにしたいと思っています。
アプリを移植するために使用できる簡単なWebアプレットAPIはありますか?
基本的なSystem.outおよびSystem.in機能を使用しているだけですが、I/Oラッパーを再構築できてうれしいです。
これらの方針に沿った何かは、自分の仕事をオンラインにしたい初心者のJava開発者にとって大きな資産になると思います。
確かに、アプレットを作成し、2つのコンポーネントを備えたJFrameを使用して小さなスイングUIを配置します。1つは出力の書き込み用、もう1つはからの入力の入力用です。ページにアプレットを埋め込みます。
Larsが提案したとおりに実行し、自分で書きました。
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」文字列を持つ別のクラス「Input」にありました。
public static String getString() {
inString = "";
// Wait for input
while (inString == "") {
try{
Thread.sleep(100);
} catch (Exception e) {}
}
return inString;
}
プロジェクトの存続期間中、私はおそらくこのコードをもう少し維持するでしょうが、現時点では動作します:)
輝かしく信じられないほど便利な cnsole のような Web アプリケーションの代表的な例として、Google シェルのgooshをご覧ください。これなしでネットをブラウジングするなんて、もう想像できません。
確かに、ソース コードはありませんが、Firebug などを使用することで、その魔法を少し引き出すことができるかもしれません。
TextArea を使用すると、バグが発生しやすいアプローチになる可能性があります。この TextArea への入力と出力の両方を行う必要があるため、カーソル位置を追跡する必要があることに注意してください。このアプローチを実際に行う場合は、プレーンな TextArea を抽象化して (継承、多分?)、たとえば a を持つコンポーネントを使用しprompt()てプロンプトを表示し、入力を有効にし、 a も通常のシェル抽象化に従うことをお勧めしますstdin(プロンプトから読み取るが、ファイルなどにバインドできるInputStream)とstdout、場合によってstderrは、TextAreaのテキストにバインドされたOutputStreamsを持っています。
それは簡単な作業ではなく、それを行うためのライブラリを知りません。
数年前(人々がtelnetを使用していた頃)にtelnetクライアントアプレットの実装を見たのを覚えています。たぶん、あなたはそれらを掘り起こし、それらを修正することができます。
System.out と System.in は静的であり、したがって悪です。それらを非静的に置き換えるプログラムを実行する必要があります(「上からパラメータ化」)。アプレットから System.setOut/setErr/setIn を使用することはできません。
その後、あなたはかなりソートされています。アプレット。TextArea (または同等のもの) を追加します。出力をテキスト領域に追加します。入力にキーストロークを書き込みます。ジョブ完了。