java - 模拟 java.util.Scanner 的用户输入

标签 java input java.util.scanner

我正在用 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/

相关文章:

java - 放置正确的光盘连接四java游戏与绘图面板

java - 强制 Jetty 7.0 响应 HTTP/1.0

javascript - ° 添加 .placeholder 时不显示在占位符中

javascript - React - 通过单击提交按钮将项目从输入添加到列表中

html - 复选框只影响一个元素?

java - 如何使用扫描仪类将值获取到字符数组中?

java - FindWithinHorizo​​n 匹配失败

java - AngularJs 通过 Maven 和 Jersey 与 Eclipse 集成

java - 使用导入静态字段是一种好的编程习惯吗?

java - 单个事务中刷新和持久化时的多个约束违规