【问题标题】:While looping not accepting my entered key - Java AWT循环时不接受我输入的密钥-Java AWT
【发布时间】:2015-03-10 20:36:50
【问题描述】:

我在我的方法中使用了一个while循环

public void keyTyped (KeyEvent e)

这里的问题是,程序进入循环,它要求用户输入。如果输入在“while”设置的参数范围内,它只会无限地重复输入。尽管我确实为此输入了代码,但它不再要求另一个输入。

我需要的是它在每次循环时询问用户输入。有什么帮助吗?

//cardChosen1 is "null" at this point`
            while (cardChosen1 < 97  || cardChosen1 > 108)
            {

                Thread.currentThread ().setPriority (Thread.MIN_PRIORITY);
                cardChosen1 = e.getKeyChar ();
                System.out.println ("Inside Loop" + cardChosen1);

                repaint ();
                try
                {
                    // Stop thread for 20 milliseconds
                    Thread.sleep (20);
                }
                catch (InterruptedException ex)
                {
                    // do nothing
                }
                Thread.currentThread ().setPriority (Thread.MAX_PRIORITY);
            }

【问题讨论】:

  • 它在哪里要求另一个输入? e.getKeyChar() 的值不会改变。
  • 这不是您为基于事件的输入创建 while 循环的方式...您需要有一个主循环,您可以在其中检查键是否被按下...如果它被按下,然后您检查它是哪一个并将其考虑为有效的用户输入。但你可能甚至不需要 while 循环
  • @Ubica 但我需要它继续询问,直到用户输入正确的密钥。
  • @iamnotmaynard 我要求另一个输入,因为当输入的输入不是有效输入时。
  • 首先查看Event Dispatching ThreadHow to write KeyListeners。 AWT 和大多数 GUI 框架一样,是一个事件驱动的环境,也就是说,您不使用“循环”来等待某事发生,您注册一个侦听器,当某些事件发生时收到通知,然后您采取行动。

标签: java multithreading while-loop awt


【解决方案1】:

与大多数 GUI 框架一样,AWT 是事件驱动的。也就是说,您向 API 注册某种回调/观察者/侦听器,并等待该回调/观察者/侦听器被通知发生了某事。

您必须记住,GUI 不是代码的线性进程,而是事件可以在任何时间以任何顺序发生,您需要为这些事件编写代码。

首先查看Event Dispatching Thread,了解在基于 AWT 的框架内生成事件和发出通知的核心机制。

然后查看How to write KeyListeners,了解您如何获得程序中关键事件的通知。

如果没有更多关于您想要实现的目标的详细信息,就很难提供更多信息,但本质上,永远不要阻塞 EDT,这将阻止它处理事件队列中的新事件并使其看起来像您的程序已挂起(因为它本质上具有)

【讨论】:

    【解决方案2】:

    这将是处理事件的好方法:

        addKeyListener(new KeyListener() {
    
            @Override
            public void keyTyped(KeyEvent event) {
                cardChosen1 = event.getKeyChar();
                if(cardChosen1 > 97  && cardChosen1 < 108){
                    // do something about the chosen card
                }else{
                    // ask user to do something else
                    // or press the key in a valid range
                }
            }
    
            @Override
            public void keyPressed(KeyEvent e) {}
            @Override
            public void keyReleased(KeyEvent e) {}
        });
    

    【讨论】:

      猜你喜欢
      • 2017-03-25
      • 2015-04-16
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2013-08-31
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多