是否可以在java中从控制台获取按键?

时间:2011-09-02 18:05:26

标签: java input console

  

可能重复:
  How to read a single char from the console in Java (as the user types it)?

我正在制作一个类似于控制台的rogu,但它是否可以在键入时进行击键?
*编辑我发现JLine,它能完成这项工作吗?如果是这样的话?

1 个答案:

答案 0 :(得分:0)

不,你无法从控制台获得按键。由于控制台依赖于系统并且从环境变为环境以及从运行到运行,因此您可能有一个用Java编写的控制台,一个用Perl编写,一个用C ++编写,具体取决于您打开程序的位置。您可能还有一个不可见的控制台(双击JAR文件)。

幸运的是,您可以编写自己的控制台。这样做很简单。

这是我最近写的一个样本:

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class Input extends JFrame implements KeyListener{
    private JTextArea out;
    private JTextField in;
    public Input(){
        out = new JTextArea();
        in = new JTextField();
        this.add(out, BorderLayout.CENTER);
        this.add(in, BorderLayout.SOUTH);
        in.addKeyListener(this);
    }
    public void keyPressed(KeyEvent e) {
    }
    public void keyReleased(KeyEvent e) {
    }
    public void keyTyped(KeyEvent e) {
        if(e.getKeyChar() == (int)'\n'){
            e.consume();
            process(in.getText());
            in.setText("");
        }
    }

    public void process(String s){
        String text = out.getText();
        out.setText(text + ((text.length() == 0) ? "" : "\n") + s);
        String query = s.substring(0, s.indexOf(' '));
        String param = s.substring(s.indexOf(' ') + 1);
        ArrayList<String> args = new ArrayList<String>();
        int i = 0;
        boolean inQuotes = false;
        StringBuffer activeString = new StringBuffer();
        while(i < param.length()){
            if(param.charAt(i) == ' ' && !inQuotes){
                args.add(activeString.toString());
                System.out.println(activeString.toString());
                activeString.setLength(0); //FIXME:works???
            } else if(param.charAt(i) == '"'){
                inQuotes = !inQuotes;
            } else {
                activeString.append(param.charAt(i));
            }
            i++;
        }
        args.add(activeString.toString());
        System.out.println(activeString.toString());
        activeString.setLength(0); //FIXME:works???
        for (String string : args) {
            activeString.append(string + ", ");
        }
        out.setText(out.getText() + "\n\t" + "Query: " + query + "; args: " + activeString.toString());
    }

    public static void main(String[] args){
        Input x = new Input();
        x.setVisible(true);
        x.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

基本上,在BorderLayout.SOUTH(BorderLayout.CENTER的文本区域)创建一个文本字段,并将KeyListener添加到文本字段。然后,您将能够从控制台读取按键。您还可以在没有控制台的情况下启动应用程序(例如,将其放入JAR文件并通过单击打开它)

TL; DR:不,但你可以自己创造并使用它:D

祝你好运!