我正在用 Java 编写一个游戏,我希望用户能够从命令行和 GUI 提供输入。目前,我使用这种方法来获取输入:
static String getInput(){
System.out.println("Your move:");
Scanner sc = new Scanner(System.in);
return sc.nextLine();
}
我想继续使用它,但让 mousePressed 事件模拟用户实际输入的内容。这不是一个有效的解决方案,但它在我的应用程序中有意义。所以问题是:如何模拟用户从代码端输入 System.in?
最佳答案
这是可能的 - System.in 最简单的替换是 PipedInputStream 。这必须连接到 PipedOutputStream从另一个线程(在本例中为 Swing 线程)写入。
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 模式下完全删除流。
关于java - 模拟 java.util.Scanner 的用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/170854/