【问题标题】:Java console keyboard - accept input automaticallyJava 控制台键盘 - 自动接受输入
【发布时间】:2024-04-27 20:20:01
【问题描述】:

我正在创建一个简单的控制台应用程序,我可以在其中使用键盘箭头键作为输入,就像典型的玩具遥控器一样。当我按向上箭头时,控制台将打印输出文本“UP”,或者如果我按向下箭头,它将打印“向下”。

我只想按一次箭头键,即我不需要在之后按 enter 来接受我的输入。我希望在按下箭头键时自动接受输入。

我已经尝试了一些代码,但这仍然没有发生,我仍然需要按 Enter 来接受我的输入。如果您知道如何尽可能简单地实现这一点,我将不胜感激。

【问题讨论】:

  • 看看这个问题。 *.com/questions/9545388/…
  • 你说你已经尝试了一些东西。请发布代码 sn-ps,您也可以尝试发布您尝试过的内容。

标签: java input keyboard


【解决方案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();
         }
      });
   }
}

【讨论】:

  • 感谢您提供此剪切和粘贴代码示例。我已经能够根据我的需要进行修改。我很欣赏你的代码的完整性(不是每个人都包括导入部分!)。
【解决方案2】:

这实际上是一个非常复杂的问题。 如果你想要一个真正的控制台应用程序(没有 GUI 元素),你必须牺牲可移植性。

默认情况下,大多数控制台都是行缓冲的,因此在按下 Enter 之前,Java 不会获得任何输入。大多数可以切换到字符模式,但是没有独立于操作系统的方法来做到这一点。欲了解更多信息,请参阅http://www.darkcoding.net/software/non-blocking-console-io-is-not-possible/

【讨论】: