可能重复:
How to read a single char from the console in Java (as the user types it)?
我正在制作一个类似于控制台的rogu,但它是否可以在键入时进行击键?
*编辑我发现JLine,它能完成这项工作吗?如果是这样的话?
答案 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
祝你好运!