문제

이봐, 나는 Java와 함께 Windows 콘솔에서 응용 프로그램을 개발하고 있으며 모든 콘솔 그래픽 글로리에 온라인으로 배치하고 싶습니다.

내 앱을 초과하는 데 사용할 수있는 간단한 웹 애플릿 API가 있습니까?

나는 단지 기본 System.out와 System.in 기능을 사용하고 있지만 I/O 래퍼를 재건하게되어 기쁩니다.

나는이 라인을 따라 무언가가 온라인으로 작업하고자하는 시작 자바 개발자에게는 훌륭한 자산이 될 것이라고 생각합니다.

도움이 되었습니까?

해결책

물론, 애플릿에 들어가서 두 가지 구성 요소가있는 JFrame과 함께 작은 스윙 UI를 입력하고 하나는 출력을 작성하고 입력을 입력하기위한 작은 스윙 UI를 넣으십시오. 페이지에 애플릿을 포함시킵니다.

다른 팁

나는 라스 내 자신을 제안하고 썼습니다.

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와 같은 WebApp의 프리미어 예로 구쉬, Google Shell. 나는 더 이상 그물을 탐색하는 것을 상상할 수 없다.

물론 소스 코드는 없지만 Firebug 정도를 사용하여 약간의 마법을 얻을 수 있습니다.

Textarea를 사용하는 것은 버그가 발생하기 쉬운 접근법 일 수 있습니다. 이 Textarea에 대한 입력 및 출력을 모두 수행해야하므로 커서 위치를 추적해야합니다. 나는 당신이 실제로이 접근법을 수행한다면, 당신은 평범한 텍스토리 (상속, 아마도?)를 추상화하고 예를 들어있는 구성 요소를 사용한다고 제안합니다. prompt() 프롬프트를 보여주고 입력을 활성화하려면 stdin (프롬프트에서 읽지 만 파일을 말하면 묶을 수있는 입력 스트림. stdout 그리고 아마도 stderr, 출력 스트림, Textarea의 텍스트에 결합됩니다.

쉬운 일이 아니며, 어떤 도서관도 모릅니다.

나는 수년 전에 텔넷 클라이언트 애플릿 구현을 기억합니다 (사람들이 텔넷을 사용했을 때). 어쩌면 당신은 그들을 파고 수정할 수 있습니다.

System.out 및 System.in은 정적이며 따라서 악입니다. 프로그램을 사용하여 비 상태로 대체해야합니다 ( "위의 매개 변수"). 애플릿에서 System.setout/seterr/setin을 사용할 수 없습니다.

그러면 당신은 거의 분류되었습니다. 애플릿. Textarea (또는 동등한)를 추가하십시오. 텍스트 영역에 출력을 추가하십시오. 입력에 키 스트로크를 작성하십시오. 작업이 완료되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top