Java jTextArea作为IO控制台

Java jTextArea作为IO控制台,java,swing,jtextarea,Java,Swing,Jtextarea,如何将用户的输入(仅限用户输入)发送到outputstream 我现在用的是一个键盘 jTextArea console = new jTextArea; console.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent e){ //save the last lines for console to variab

如何将用户的输入(仅限用户输入)发送到outputstream

我现在用的是一个键盘

jTextArea console = new jTextArea;
console.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyReleased(java.awt.event.KeyEvent e){
            //save the last lines for console to variable input
            if(e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER){

                try {
                    int line = console.getLineCount() -2;
                    int start = console.getLineStartOffset(line);
                    int end = console.getLineEndOffset(line);
                    input = console.getText(start, end  - start);
                    send = true;
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        }
    });`
正如您所看到的,当用户按下Enter键时,控制台的最后一行,textarea

我想做的是,只发送用户输入,而不是最后一行。
任何帮助都将不胜感激。

我建议,当释放任何其他键时,如果starflag=true,您将存储开始,并按您所说的将startflag设置为false,当实际按下“enter”时,您可以执行startflag=true;并将结束存储为getCaretPosition()

除此之外,我对你的意图的理解有些模糊,但以下是我的想法: 如果您在控制台中有一个完整的“对话”,并且您想要所有的用户条目,那么您可以简单地使用ArrayList userinputs,而不是start=console.getCaretPosition(),您可以执行userinputs.add(新点(console.getCaretPosition(),-1));然后,当用户结束输入时(或在STDOUT发送输入之前),执行userinputs.get(userinputs.size()-1).y=console.getCaretPosition()(或者您可以存储一个临时点,并且仅在该点完成时添加该点,也可以在该点结束时添加。)

如果您在按下enter键时将用户输入发送到输出,那么我看不出除了上面的简单代码之外还需要什么,它基本上是这样工作的:

public void keyReleased(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ENTER){
    startflag = true;
    //Just get the text from the start(stored below), and up until where the caret is now, as the users output.
}else{
    if(startflag){
         start = console.getCaretPosition()
         startflag = false;
    }
}
}

我建议,当任何其他键被释放时,如果starflag=true,则存储start,并如您所说将startflag设置为false,当实际按下“enter”时,您可以执行startflag=true;并将结束存储为getCaretPosition()

除此之外,我对你的意图的理解有些模糊,但以下是我的想法: 如果您在控制台中有一个完整的“对话”,并且您想要所有的用户条目,那么您可以简单地使用ArrayList userinputs,而不是start=console.getCaretPosition(),您可以执行userinputs.add(新点(console.getCaretPosition(),-1));然后,当用户结束输入时(或在STDOUT发送输入之前),执行userinputs.get(userinputs.size()-1).y=console.getCaretPosition()(或者您可以存储一个临时点,并且仅在该点完成时添加该点,也可以在该点结束时添加。)

如果您在按下enter键时将用户输入发送到输出,那么我看不出除了上面的简单代码之外还需要什么,它基本上是这样工作的:

public void keyReleased(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ENTER){
    startflag = true;
    //Just get the text from the start(stored below), and up until where the caret is now, as the users output.
}else{
    if(startflag){
         start = console.getCaretPosition()
         startflag = false;
    }
}
}

好吧,这就是我的想法

基本思想是我们要跟踪“用户”输入和“过程”输出

基本上,我所做的是设置它,以便当进程终止时,我们计算插入符号在文档中的当前位置,并将其标记为用户输入的开始位置

本例不包括将输出写入进程,您可以将其滑入;)


好吧,这就是我的想法

基本思想是我们要跟踪“用户”输入和“过程”输出

基本上,我所做的是设置它,以便当进程终止时,我们计算插入符号在文档中的当前位置,并将其标记为用户输入的开始位置

本例不包括将输出写入进程,您可以将其滑入;)



还有什么输入到你的文本区域?输入流,标准输出。jTextArea被用作IO的控制台。您可以使用密钥侦听器标记用户开始键入的点,并在按enter键时重置该点,只发送这两点之间的字符。我更愿意跟踪
STDOUT
上一次个人编写的内容……是的,这就是我刚才所想的,但我不知道如何实现……哪一个?
KeyListener
STDOUT
监视器…?您的文本区域还输入了什么?输入流,STDOUT。jTextArea被用作IO的控制台。您可以使用密钥侦听器标记用户开始键入的点,并在按enter键时重置该点,只发送这两点之间的字符。我更愿意跟踪
STDOUT
上一次个人编写的内容……是的,这就是我刚才所想的,但我不知道如何实现……哪一个?
keylister
STDOUT
监视器…?这实际上是我现在的代码。但它在某些情况下并不起作用。有时有效,有时无效这实际上是我现在的代码。但它在某些情况下并不起作用。有时有效,有时无效嗨!很抱歉,很长时间没有回复。不管怎么说,我现在使用keyListners和startflags让它工作了。我得到了
javax.swing.text.BadLocationException:当我更新控制台构造函数时,长度必须是正的
异常。
consoleConstructorMethod=null
是否使现有构造函数无效?我的代码是这样的<代码>consoleConstructorMethod=null;新的控制台结构方法我想我得到这个异常是因为,控制台正在更新。老实说,如果没有看到实际的代码,很难知道。最好发布一个新问题嗨!你能帮我说说你说的文档过滤和“保护”吗?一个主意会有帮助的。。谢谢。我添加了一个新的示例,使用
DocumentFilter
保护当前用户输入范围以外的区域-只进行快速测试,但这个想法应该是sound@useletters我还应该提到,我通过使用“cmd/c…”来执行目录列表之类的操作,从而在windows上实现了这个示例;)你好很抱歉,很长时间没有回复。不管怎么说,我现在使用keyListners和startflags让它工作了。我得到了
javax.swing.text.BadLocationException:当我更新控制台构造函数时,长度必须是正的
异常。consoleConstructorMethod是否为空
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class QuickTerminal {

    public static void main(String[] args) {
        new QuickTerminal();
    }

    public QuickTerminal() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ConsolePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public interface CommandListener {

        public void commandOutput(String text);

        public void commandCompleted(String cmd, int result);

        public void commandFailed(Exception exp);
    }

    public class ConsolePane extends JPanel implements CommandListener, UserInput {

        private JTextArea textArea;
        private int userInputStart = 0;
        private Command cmd;

        public ConsolePane() {

            cmd = new Command(this);

            setLayout(new BorderLayout());
            textArea = new JTextArea(20, 30);
            ((AbstractDocument)textArea.getDocument()).setDocumentFilter(new ProtectedDocumentFilter(this));
            add(new JScrollPane(textArea));

            textArea.addKeyListener(new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                        int range = textArea.getCaretPosition() - userInputStart;
                        try {
                            String text = textArea.getText(userInputStart, range).trim();
                            System.out.println("[" + text + "]");
                            userInputStart += range;
                            if (!cmd.isRunning()) {
                                cmd.execute(text);
                            } else {
                            }
                        } catch (BadLocationException ex) {
                            Logger.getLogger(QuickTerminal.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } else {
//                        if (!cmd.isRunning()) {
//                            cmd.send(...);
//                        }
                    }
                }
            });
        }

        @Override
        public void commandOutput(String text) {
            SwingUtilities.invokeLater(new AppendTask(textArea, text));
        }

        @Override
        public void commandFailed(Exception exp) {
            SwingUtilities.invokeLater(new AppendTask(textArea, "Command failed - " + exp.getMessage()));
        }

        @Override
        public void commandCompleted(String cmd, int result) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    int pos = textArea.getCaretPosition();

                    System.out.println("pos = " + pos + "; length = " + textArea.getText().length());

                    textArea.setCaretPosition(textArea.getText().length());
                    userInputStart = pos;
                }
            });
        }

        @Override
        public int getUserInputStart() {
            return userInputStart;
        }
    }

    public interface UserInput {

        public int getUserInputStart();
    }

    public class AppendTask implements Runnable {

        private JTextArea textArea;
        private String text;

        public AppendTask(JTextArea textArea, String text) {
            this.textArea = textArea;
            this.text = text;
        }

        @Override
        public void run() {
            textArea.append(text);
        }
    }

    public class Command {

        private CommandListener listener;
        private ProcessRunner runner;

        public Command(CommandListener listener) {
            this.listener = listener;
        }

        public boolean isRunning() {

            return runner != null && runner.isAlive();

        }

        public void execute(String cmd) {

            if (!cmd.trim().isEmpty()) {


                List<String> values = new ArrayList<>(25);
                if (cmd.contains("\"")) {

                    while (cmd.contains("\"")) {

                        String start = cmd.substring(0, cmd.indexOf("\""));
                        cmd = cmd.substring(start.length());
                        String quote = cmd.substring(cmd.indexOf("\"") + 1);
                        cmd = cmd.substring(cmd.indexOf("\"") + 1);
                        quote = quote.substring(0, cmd.indexOf("\""));
                        cmd = cmd.substring(cmd.indexOf("\"") + 1);

                        if (!start.trim().isEmpty()) {
                            String parts[] = start.trim().split(" ");
                            values.addAll(Arrays.asList(parts));
                        }
                        values.add(quote.trim());

                    }

                    if (!cmd.trim().isEmpty()) {
                        String parts[] = cmd.trim().split(" ");
                        values.addAll(Arrays.asList(parts));
                    }

                    for (String value : values) {
                        System.out.println("[" + value + "]");
                    }

                } else {

                    if (!cmd.trim().isEmpty()) {
                        String parts[] = cmd.trim().split(" ");
                        values.addAll(Arrays.asList(parts));
                    }

                }

                runner = new ProcessRunner(listener, values);

            }

        }

        public void send(String cmd) {
            // Send user input to the running process...
        }
    }

    public class ProcessRunner extends Thread {

        private List<String> cmds;
        private CommandListener listener;

        public ProcessRunner(CommandListener listener, List<String> cmds) {
            this.cmds = cmds;
            this.listener = listener;
            start();
        }

        @Override
        public void run() {
            try {
                System.out.println("cmds = " + cmds);
                ProcessBuilder pb = new ProcessBuilder(cmds);
                pb.redirectErrorStream();
                Process p = pb.start();
                StreamReader reader = new StreamReader(listener, p.getInputStream());
                // Need a stream writer...

                int result = p.waitFor();

                // Terminate the stream writer
                reader.join();

                listener.commandCompleted(null, result);
            } catch (Exception exp) {
                exp.printStackTrace();
            }
        }
    }

    public class StreamReader extends Thread {

        private InputStream is;
        private CommandListener listener;

        public StreamReader(CommandListener listener, InputStream is) {
            this.is = is;
            this.listener = listener;
            start();
        }

        @Override
        public void run() {
            try {
                int value = -1;
                while ((value = is.read()) != -1) {
                    listener.commandOutput(Character.toString((char) value));
                }
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }
    }

    public class ProtectedDocumentFilter extends DocumentFilter {

        private UserInput userInput;

        public ProtectedDocumentFilter(UserInput userInput) {
            this.userInput = userInput;
        }

        public UserInput getUserInput() {
            return userInput;
        }

        @Override
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
            if (offset >= getUserInput().getUserInputStart()) {
                super.insertString(fb, offset, string, attr);
            }
        }

        @Override
        public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            if (offset >= getUserInput().getUserInputStart()) {
                super.remove(fb, offset, length); //To change body of generated methods, choose Tools | Templates.
            }
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            if (offset >= getUserInput().getUserInputStart()) {
                super.replace(fb, offset, length, text, attrs); //To change body of generated methods, choose Tools | Templates.
            }
        }
    }
}