有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JNativeHook将密钥写入textarea

当记录keyevents时,它将打印到控制台。但不向文本区域添加任何文本

我这里有一个框架:

public class A extends javax.swing.JFrame {

public A() {
    initComponents();
}


@SuppressWarnings("unchecked")                         
private void initComponents() {
 //code for components
}                     

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {  
    try {
        GlobalScreen.registerNativeHook();
    }
    catch (NativeHookException ex) {
        System.err.println("There was a problem registering the native hook.");
        System.err.println(ex.getMessage());

        System.exit(1);
    }

    GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
    jTextArea1.append("logging started:\n");
}                                        
    }

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new A().setVisible(true);
        }
    });
}

//calling this method when ever a keyevent is occured. but its not appending any text.
public void getTA(){
    jTextArea1.append("something was pressed");
}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration                   
}

globalkeylistener的代码

public class GlobalKeyListenerExample implements NativeKeyListener {
A a;
public GlobalKeyListenerExample(){
  a = new A();
}

public void nativeKeyPressed(NativeKeyEvent e) {
    a.getTA();
    System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}

public void nativeKeyReleased(NativeKeyEvent e) {
    a.getTA();
    System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}

public void nativeKeyTyped(NativeKeyEvent e) {
    a.getTA();
    System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
}

}

当发生事件但未追加任何内容时,我调用getTA()。任何帮助都会很好


共 (2) 个答案

  1. # 1 楼答案

    正如我所说,您正在GlobalKeyListenerExample类中创建一个新的class A对象。所以你有两个画面,一个是可见的,一个是隐藏的

    当您调用a.getTA();时,您正在调用一个从以下GlobalKeyListenerExample类创建的对象。因此,将文本设置为不可见框架的jtextfield

    public  GlobalKeyListenerExample(){
      a = new A();//invisible frame
    }
    

    那么如何解决这个问题呢。 一种方法是在不创建GlobalKeyListener类的情况下,对类A实现NativeKeyListener。所以你实现了所有的抽象方法,就像你在GlobalKeyListener类中所做的那样

    并使用GlobalScreen.addNativeKeyListener(this);添加listner

    范例

    public class A extends javax.swing.JFrame implements NativeKeyListener {
    
        public A() {
            initComponents();
        }
    
        //implement abstract methods  
        @Override
        public void nativeKeyPressed(NativeKeyEvent e) {
            a.getTA();
            System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
        }
    
        public void nativeKeyReleased(NativeKeyEvent e) {
            a.getTA();
            System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
        }
    
        public void nativeKeyTyped(NativeKeyEvent e) {
            a.getTA();
            System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
        }
    
        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
            try {
                GlobalScreen.registerNativeHook();
            } catch (NativeHookException ex) {
                System.err.println("There was a problem registering the native hook.");
                System.err.println(ex.getMessage());
    
                System.exit(1);
            }
    
            GlobalScreen.addNativeKeyListener(this);// add listner
            jTextArea1.append("logging started:\n");
        }
    
    }
    

    我无法测试这个代码示例。如果你有任何问题,请询问

  2. # 2 楼答案

    作为对框架的扩展,它正在代码的这一部分中创建一个新框架

    public GlobalKeyListenerExample(){
        a = new A();
    }
    

    。通过设置a.setVisible(true),它是可见的,每次事件发生时,文本都会附加到此帧中的文本区域

    public GlobalKeyListenerExample(){
        a = new A();
        a.setVisible(true);
    }
    

    谢谢fast snail帮了我的忙