1

おもちゃの典型的なリモコンのように、キーボードの矢印キーを入力として使用できる単純なコンソールアプリケーションを作成しています。上向き矢印を押すと、コンソールは出力テキスト「UP」を印刷します。下向き矢印を押すと、「下向き」と印刷されます。

矢印キーを1回だけ押したい、つまり、入力を受け入れるために後でEnterキーを押す必要はありません。矢印キーを押すと自動的に入力が受け入れられるようにしたい。

私はすでにいくつかのコードを試しましたが、これはまだ発生しておらず、入力を受け入れるためにEnterキーを押す必要があります。私がこれをできるだけ簡単に達成する方法について何か考えがあれば、私はそれを本当に感謝します。

4

2 に答える 2

1

このサンプル コードは、左矢印キー イベントを取得するのに役立ちます。これを参照することができます、

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class Test2 extends JPanel {
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private static final int TIMER_DELAY = 50;
   private Timer leftKeyTimer = new Timer(TIMER_DELAY , new TimerListener());


   public Test2() {
      int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
      InputMap inputMap = getInputMap(condition );
      ActionMap actionMap = getActionMap();

      String leftDownKey = "Left Down";
      String leftUpKey = "Left Up";
      KeyStroke leftDown = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT , 0, false);
      KeyStroke leftUp = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT , 0, true);
      inputMap.put(leftDown, leftDownKey);
      inputMap.put(leftUp, leftUpKey);

      actionMap.put(leftDownKey, new LeftKeyAction(false));
      actionMap.put(leftUpKey, new LeftKeyAction(true));
      leftKeyTimer.setActionCommand("Left Key");
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private class LeftKeyAction extends AbstractAction {
      private boolean onKeyRelease;

      public LeftKeyAction(boolean onKeyRelease) {
         this.onKeyRelease = onKeyRelease;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         if (onKeyRelease) {
            if (leftKeyTimer != null && leftKeyTimer.isRunning()) {
               leftKeyTimer.stop();
            }
         } else {
            if (leftKeyTimer != null && !leftKeyTimer.isRunning()) {
               leftKeyTimer.start();
            }

         }
      }
   }

   private class TimerListener implements ActionListener {
      public void actionPerformed(ActionEvent actEvt) {
         System.out.println(actEvt.getActionCommand());
      }
   }

   private static void createAndShowGui() {
      Test2 mainPanel = new Test2();

      JFrame frame = new JFrame("Test2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2012-08-23T09:09:54.903 に答える
0

これは実際には驚くほど複雑な問題です。真のコンソール アプリ (GUI 要素なし) が必要な場合は、移植性を犠牲にする必要があります。

ほとんどのコンソールはデフォルトで行バッファリングされているため、Enter キーが押されるまで Java は入力を取得しません。ほとんどはキャラクターモードに切り替えることができますが、これを行う OS に依存しない方法はありません。詳細については、http://www.darkcoding.net/software/non-blocking-console-io-is-not-possible/を参照してください。

于 2012-08-23T09:37:40.973 に答える