【问题标题】:break a loop if Esc was pressed如果按下 Esc 则中断循环
【发布时间】:2023-10-31 00:36:01
【问题描述】:

我用 JAVA 语言编写了一个程序,它通过使用 Scanner 类接受来自控制台的输入....

现在我想将此功能添加到我的代码中,以便在用户按下 Esc 按钮时存在循环 (while)。 到目前为止,我认为键盘类可以帮助我,但它就像扫描仪一样......我尝试使用事件但不知道如何正确使用它们......

源代码:

    package switchCase_v1;

     import cs1.Keyboard;
     import java.util.EventObject;
     import java.awt.AWTEvent;
     import java.awt.event.KeyEvent;
     import java.awt.event.ComponentEvent;
     import java.awt.event.InputEvent;
     import java.util.*;

      public class SwithCase {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        System.out.println("enter the name or number of month: ");
        int monthNumber = input.nextInt();

        while (true) {
            KeyEvent button;
            if (button.getKeyCode() == 27)
                break;
            else if (monthNumber == '\n') {
                System.out.println("enter a number");
                monthNumber = input.nextInt();
            } else {
                switch (monthNumber) {
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                    System.out.println("it has 31 days");
                    monthNumber = input.nextInt();
                    break;
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                case 12:
                    System.out.println("it has 30 days");
                    monthNumber = input.nextInt();
                    break;
                default:
                    System.out.println("it is not a valid number");
                    monthNumber = input.nextInt();
                    break;
                }
            }

        }
    }
  }

当我想考虑“Esc”或“Enter”等点击按钮时,我该如何处理?我认为它应该也适用于使用ASCII码。

这是我的代码的新版本:

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Scanner input = new Scanner(System.in);
    System.out.print("Check number of days");
    KeyEvent e;
    if (e.getKeyCode() == KeyEvent.VK_ENTER)
    {
    System.out.println("enter the name or number of month: ");
    int monthNumber=input.nextInt();
    }
    else if (Keyboard.getEventKey()==Keyboard.KEY_ESCAPE)
    {
        System.out.println("GoodBye");
    }
    }   

}

但是它有一个错误说 e 对象可能没有被初始化...!!!!!我该怎么办?!!!

【问题讨论】:

    标签: java loops break


    【解决方案1】:

    您目前正在制作一个命令行应用程序,该应用程序从标准输入读取内容并将内容打印到标准输出。如何处理按钮按下完全取决于您运行程序的终端,并且大多数终端在按下转义时不会向您的应用程序的标准输入发送任何内容。

    如果您想捕捉关键事件,您必须使用 AWT 或 Swing 制作一个 GUI 应用程序。如果您只想在程序运行时终止程序,请尝试按 Ctrl+C(这适用于大多数终端)。

    【讨论】:

    • TNX 很多...在检查了其他朋友建议的所有解决方案后,我达到了您提到的内容...我得出的结论是,在没有 GUI 的情况下,不可能将此选项添加到此类代码中。
    • C# (Mono) 能够实现使用 Windows 控制台(在 Windows 上)和 TermInfo 控制台(在非 Windows 上)的跨平台 Console.ReadKey()。以下是源代码:github.com/mono/mono/blob/…
    【解决方案2】:

    看看这个页面,它可以帮助你: http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

    特别是这部分:

    int getKeyCode()

    获取与此事件关联的密钥代码。键代码标识用户按下或释放的键盘上的特定键。 KeyEvent 类为常见的键定义了许多键代码常量。例如,VK_A 指定标记为 A 的键,VK_ESCAPE 指定 Escape 键。

    【讨论】:

    • 一直在尝试使用您的建议,但似乎有问题。当我想使用 getKeyCode 时,我必须从 KeyEvent 类创建一个需要引入一些初始值的 objrct ......我不知道如何初始化它......我应该提到我已经将我的代码架构更改为两个类,其中一个包含主要方法。查看以下源代码:
    • @msc87 您需要合并一个KeyListener。这是 Java 的 Swing 监控按键的方式。
    • 我从 KeyEvent 类创建了一个对象“e”,它需要引入一些初始值......我不知道如何初始化它......我应该提到我已经改变了我的代码架构分为两个类,其中一个包含主要方法。看我上面代码的新版本:
    • @msc87 请参阅 AardvarkSoup 的回答,了解为什么您可能无法从控制台应用程序中获取 ESC - 我建议您实现 Swing GUI 并使用 a KeyListener
    【解决方案3】:

    请注意,Keylisteners 可能并不总是您想要的。更完整的答案还包括对添加 keyBINDINGS 的参考,这有点难以设置,但也更通用。所以这就是一个人可以做到的。

    首先创建一个新类。如果耦合动作需要参数,请在构造函数中设置它们。让类扩展 AbstractAction 以便我们可以覆盖 ActionPerformed 方法。

    public class UserAction extends AbstractAction {
    
    String optionalParam;
    
    UserAction(String optionalParam){
    this.optionalParam = optionalParam;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
    
        System.out.println("Action Performed!");
    
        }
    
    }
    

    然后使用以下命令调用该操作。请注意,getinputmnap 接受一个参数整数,表示对象的焦点状态。三个有效选项是“JComponent.WHEN_IN_FOCUSSED_WINDOW”“JComponent.WHEN_FOCUSSED”(默认)和“JComponent.WHEN_ANCESTER_OF_FOCUSSED_COMPONENT”。

    JFrame graphicalUI = new JFrame();
    
    JPanel panelWithKeybind = new JPanel();
    
    Action userAction = new UserAction() //add params as constructor requires
    
    panelWithKeybind.getinputmap(int 
    focus_Status_Of_Panel).put(KeyStroke.getKeyStroke("ESCAPE"),"submit"); //Key
                                                                           
    panelWithKeybind.getActionMap().put("submit",userAction);
    

    【讨论】:

      最近更新 更多