首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟java.util.Scanner的用户输入

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

Stack Overflow用户
提问于 2008-10-04 19:03:00
回答 4查看 5.4K关注 0票数 1

我正在用Java编写一个游戏,我希望用户能够从命令行和GUI提供输入。目前,我使用此方法来获取输入:

代码语言:javascript
复制
    static String getInput(){
        System.out.println("Your move:");
        Scanner sc = new Scanner(System.in);
        return sc.nextLine();
    }

我想继续使用它,但是让一个mousePressed事件来模拟用户实际输入的内容。这不是一个有效的解决方案,但在我的应用程序中它是有意义的。所以问题是:我如何从代码端模拟用户输入System.in?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-10-04 23:34:52

这是可能的-- System.in最简单的替代品是PipedInputStream。它必须挂接到一个从另一个线程(在本例中是Swing线程)写入的PipedOutputStream

代码语言:javascript
复制
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模式下完全切断流。

票数 1
EN

Stack Overflow用户

发布于 2008-10-04 19:11:09

我曾经做过一个应用程序,可以通过命令行或使用GUI运行。

我这样做的方式是定义一个接口(名为IODevice),它定义了以下方法:

输出公共字符串getInput();

  • public
  • ( String ShowOutput);

然后,我有两个实现此接口的类-一个使用主机的终端(就像您现在所做的那样),另一个使用JTextArea (输出)/ JOptionPane (输入)。

也许您可以做类似的事情--要更改所使用的输入设备,只需更改IODevice的实例。

希望这能对你有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2008-10-04 19:17:14

老实说,在重读了你的问题后,我不太确定你想要什么。

无论如何,您可能需要检查java.lang.System.setIn方法(InputStream in)。这将允许您更改用于读取来自终端的输入的阅读器(例如,将其从实际的终端更改为您喜欢的任何内容)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/170854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档