2008-09-26 6 views
5

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

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

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

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

ответ

4

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

+0

Done, отправил результат ниже. Спасибо, Ларс! – 2008-10-09 12:38:04

0

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

0

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

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

+0

Я использую System.in и System.out только в своей оболочке класса IO - это не займет слишком много времени. Итак, я полагаю, что ответ заключается только в использовании TextArea. Благодаря! – 2008-09-28 22:14:19

3

Как главный пример славного и невероятно полезного cnsole-like webapp, см. goosh, Google Shell. Я не могу представить, что теперь просматриваю Сеть без нее.

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

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

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

4

Я сделал как 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».

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

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

     return inString; 
    } 

Сквозной из срока жизни проекта я, вероятно, поддерживать этот код немного, но на данный момент - это работает :)

Смежные вопросы