3

我用 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 对象可能没有被初始化......!!!!!我该怎么办?!

4

3 回答 3

7

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

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

于 2012-05-25T13:32:09.403 回答
3

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

特别是这部分:

int getKeyCode()

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

于 2012-05-24T19:41:58.353 回答
1

请注意,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);
于 2021-08-21T10:58:52.080 回答