我正在用Java编写一个游戏,我希望用户能够从命令行和GUI提供输入。目前,我使用此方法来获取输入:
static String getInput(){
System.out.println("Your move:");
Scanner sc = new Scanner(System.in);
return sc.nextLine();
}我想继续使用它,但是让一个mousePressed事件来模拟用户实际输入的内容。这不是一个有效的解决方案,但在我的应用程序中它是有意义的。所以问题是:我如何从代码端模拟用户输入System.in?
发布于 2008-10-04 23:34:52
这是可能的-- System.in最简单的替代品是PipedInputStream。它必须挂接到一个从另一个线程(在本例中是Swing线程)写入的PipedOutputStream。
public class GameInput {
private Scanner scanner;
/**CLI constructor*/
public GameInput() {
scanner = new Scanner(System.in);
}
/**GUI constructor*/
public GameInput(PipedOutputStream out) throws IOException {
InputStream in = new PipedInputStream(out);
scanner = new Scanner(in);
}
public String getInput() {
return scanner.nextLine();
}
public static void main(String[] args) throws IOException {
GameInput gameInput;
PipedOutputStream output = new PipedOutputStream();
final PrintWriter writer = new PrintWriter(output);
gameInput = new GameInput(output);
final JTextField textField = new JTextField(30);
final JButton button = new JButton("OK");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String data = textField.getText();
writer.println(data);
writer.flush();
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(textField);
frame.getContentPane().add(button);
frame.pack();
frame.setVisible(true);
String data = gameInput.getInput();
System.out.println("Input=" + data);
System.exit(0);
}
}但是,最好重新考虑一下游戏逻辑,在GUI模式下完全切断流。
发布于 2008-10-04 19:11:09
我曾经做过一个应用程序,可以通过命令行或使用GUI运行。
我这样做的方式是定义一个接口(名为IODevice),它定义了以下方法:
输出公共字符串getInput();
然后,我有两个实现此接口的类-一个使用主机的终端(就像您现在所做的那样),另一个使用JTextArea (输出)/ JOptionPane (输入)。
也许您可以做类似的事情--要更改所使用的输入设备,只需更改IODevice的实例。
希望这能对你有所帮助。
发布于 2008-10-04 19:17:14
老实说,在重读了你的问题后,我不太确定你想要什么。
无论如何,您可能需要检查java.lang.System.setIn方法(InputStream in)。这将允许您更改用于读取来自终端的输入的阅读器(例如,将其从实际的终端更改为您喜欢的任何内容)
https://stackoverflow.com/questions/170854
复制相似问题