1

我被引导到 Hackertyper.com 网站——这让我非常感兴趣。所以我决定,我会尝试使用 Java 重写它。我在做的时候偶然发现了一些问题。

目前,到目前为止,从我的 Java 入门课程开始,我只学习了如何使用 Scanner 类,所以目前,我的“代码”仅在按下“Enter”键后才需要输入。同时,按回车键,整个字符串被打印出来。

我的问题是:

  1. 是否有任何库可以在其中进行输入(在这种情况下是键盘上的任何键)并在不按“Enter”的情况下执行某些操作,并且。
  2. 在执行下一个循环之前,我需要做什么才能接受输入、停止一段代码、等待下一个输入?

到目前为止,下面是我所拥有的编写得很糟糕的代码。

String paragraph = "hellothere";

        Scanner newInput = new Scanner(System.in);
        String input = newInput.nextLine();

        for(int i = 0; i < paragraph.length(); i++){
            if(input.equals("2")){
                System.out.print(paragraph.charAt(i));
                input = newInput.nextLine(); // call input again after executed the loop
            }
        }

在我解决了这些问题之后,我想我会涉足 IO 并让 Java 调用一个文本文件,其中里面会有一些代码,onKeyPress 会输入第 i 个索引。

谢谢!

4

3 回答 3

1

我建议您使用该SWT工具包。

对于功能示例,请在下面运行我的代码。您只需要添加 SWT 依赖项。

写入控制台是愚蠢的。这更酷:

public class Waffles
{
    // Keeps track of how many times any key is pressed
    private static int keyCounter = 0;

    // Used to continuously append characters from the input string
    private final StringBuilder builder;

    // This can be read from a file, or whatever
    private final String GIBBERISH;

    public static void main(final String[] args) 
    {
            new Waffles();
    }

    private Waffles() 
    {
            builder = new StringBuilder();

            // Put your dummy code here (extract from a file)
            GIBBERISH = " I freaking love waffles!";

            // Loop the SWT Display
            init();
    }

    private void init() 
    {
            final Display display = new Display();
            final Shell shell = new Shell(display);
            shell.setText("HackerTyper");
            shell.setSize(500, 500);
            shell.setLayout(new GridLayout());
            shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

            // Here we create the text area
            createWidget(shell);

            shell.open();
            while (!shell.isDisposed()) 
            {
                  if (!display.readAndDispatch()) 
                        display.sleep();
            }
            display.dispose();
    }

    private void createWidget(final Composite parent)
    {
            // Wrap it for multi line text, and set it to read only, so we can't modify 
            // the text 'manually'
            final Text textArea = new Text(parent, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
            textArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

            // Yay colours! 
            textArea.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
            textArea.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN));

            // This is what was recommended by the other two answers
            textArea.addKeyListener(new KeyListener() 
            {

                    @Override
                    public void keyPressed(final KeyEvent arg0) 
                    {
                           // *magic*
                           textArea.setText( getGibberish() );
                    }

                    @Override
                    public void keyReleased(final KeyEvent arg0) 
                    {

                    }

            });
    }

    private String getGibberish()
    {
            if (keyCounter > GIBBERISH.length() - 1)
                    keyCounter = 0; // Careful not to go out of string bounds

            // Continuously append it, then pass the whole text to the textArea
            builder.append( GIBBERISH.charAt(keyCounter++) );
            return builder.toString();
    }

}

感觉像个黑客。像黑客一样。咻咻咻!我真的累了。

于 2013-08-05T00:45:49.487 回答
1

我假设您的意思是Hacker Typer,而不是黑客类型?

1)我认为你需要的是一个关键的监听事件

2)您可以编写一个在键事件触发时调用的方法。然后该方法将返回一段文本。您将文本存储在一个数组中,因此它总是返回下一段代码。 要从字符串创建数组,您可以使用String.split
编辑:我刚刚看到它总是放两个字符,而不是下一个单词。

于 2013-08-04T23:23:03.217 回答
0

有一个名为 KeyListener 的接口,但这仅适用于swing类,并且基于您编写的控制台应用程序的代码。您可以使用JNativehook,它允许您在控制台应用程序中使用摇摆事件。不过,在使用它之前,您应该学习基本的挥杆事件。

于 2013-08-04T23:38:35.170 回答