【问题标题】:How to create an own event in java如何在java中创建自己的事件
【发布时间】:2016-02-10 09:18:03
【问题描述】:

我想知道是否可以在 java 中创建一个偶数,而无需不断轮询我正在观察的值的状态。

例如,我是否可以创建一个在用户按下空格键时发生的事件,而不检查是否按下空格键,这样只有当用户按下空格键时才会调用函数?

【问题讨论】:

  • “不断轮询我正在观察的值的状态”是什么意思?
  • 是的,您必须向您的父组件添加一个 keylistener,它将已经存在的 keypressevent 定向到您的组件。 docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html
  • 原理在en.wikipedia.org/wiki/Observer_pattern观察者模式中有描述......
  • @Sher Alam 我的意思是,我希望在值更改时发生事件,例如一个键的值是“假”,因为它没有被按下并在用户按下它时变为真,而不必编写一个while循环来定期检查该键是否被按下。
  • @Martin Frank 但是通知观察者的问题,只有当按键从不被按下变为被按下而不检查while循环中的状态时仍然存在。

标签: java events


【解决方案1】:

使用观察者模式,Java 已经实现。检查 Java 文档或here

【讨论】:

    【解决方案2】:

    由于默认操作系统仅提供按键事件驱动的支持,因此您必须编写自己的键盘驱动程序,您可以在其中提供轮询按键状态的方法...

    (请记住,您的键盘上没有硬件引脚,可以像在微控制器上那样检查每个键,键盘本身会处理状态并将事件发送到操作系统,操作系统在其一侧调用“中断”。这些中断由驱动程序处理,即键盘驱动程序

    Writing a keyboard device driver

    您可以更轻松地编写自己的键盘类来映射所有键事件并可以轮询

    class KeyboardState extends KeyAdapter{
    
        boolean[] keyState = new boolean[256];
    
        @Override
        public void keyPressed (KeyEvent ke){
            keyState[ke.keyCode] = true;
        }
    
        @Override
        public void keyReleased(KeyEvent ke){
            keyState[ke.keyCode] = false;
        }
    
        public boolean isKeyDown(int keyCode){
            return keyState[keyCode];
        }
    }
    

    此代码已直接用 SO 编写,因此无需验证...不要忘记将您的键盘添加到相应的框架...

    (如果您正在收听控制台输入,请告诉我 - 这个答案不适合)...

    【讨论】:

    • 不会是keyEvent.getKeyCode() 吗?我想是的,请在你的代码中更正它^_^哈哈,玩得开心,快乐编码!
    【解决方案3】:

    一个布尔标志

    boolean flag = false;
    

    这是一个 JTextField。

    JTextField tf = new JTextField();
    

    然后你添加一个 Key Listener 来监听它上面的关键事件。

     tf.addKeyListener(kl);
    

    kl 是您之前创建的 KeyListener 的一个对象。

    KeyListener kl = new KeyListener(){
       ...
       onKeyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_SPACE) {
             System.out.println("space hit");
             flag = !flag;      //I think this is what you want
            }
         }
         ...
    };
    

    这不是有效的代码。只是一个示例,让您更好地了解 Listeners。

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多