1

私はウェブサイト Hackertyper.com に誘導されました - そして、私は非常に興味をそそられました。そこで、Java を使って書き直すことにしました。私はそれをしている間にいくつかの問題に出くわしました。

現在、入門 Java コースまでは、Scanner クラスの使用方法しか学習していないため、現時点では、「コード」は「Enter」キーを押した後にのみ入力を受け取ります。同時に、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

ハッカータイプではなく、ハッカータイプを意味していると思いますか?

1)必要なのはキーリスナーイベントだと思います

2) キー イベントが発生したときに呼び出されるメソッドを作成できます。このメソッドは、テキストの一部を返します。テキストを配列に格納するため、常に次のコードが返されます。 文字列から配列を作成するには、String.split
編集を使用できます。次の単語ではなく、常に 2 つの文字が配置されることがわかりました。

于 2013-08-04T23:23:03.217 に答える
0

KeyListener と呼ばれるインターフェースがありますが、これはスイングクラスでのみ機能し、これはコンソール アプリケーションのコードに基づいています。コンソール アプリケーションでスイング イベントを使用できるようにする JNativehook を使用できますただし、これを使用する前に、基本的なスイング イベントを学習する必要があります。

于 2013-08-04T23:38:35.170 に答える