JNativeHook(GlobalScreen)不使用switch和if语句

时间:2017-06-16 18:49:52

标签: java swing

我正在创建一个简单的工具来检索当前的鼠标坐标,以帮助我编写未来的项目。我决定不下载一个,因为我想扩展我作为一个自学成才的程序员的知识。

我正在使用JNativeHook作为NetBeans中的库,以便在JFrame未集中时帮助我使用KeyListeners。我已经研究和调试了几个小时,并且已经发现KeyReleased方法不适用于if和switch语句。它检测到KeyRelease,因为我将System.out.println();放在方法中;它打印出来了。我的代码在下面。

package Main;

import java.awt.MouseInfo;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.util.logging.LogManager;
import javax.swing.*;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.dispatcher.SwingDispatchService;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class MainClass implements NativeKeyListener {

    static JFrame frame;
    static JLabel label;
    static JPanel panel;
    static boolean run = true; //pause variable

    private static void jframe(){ //JFrame code
        frame = new JFrame("Mouse Coordinates");    
        label = new JLabel();
        panel = new JPanel();
        frame.setUndecorated(true);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setAlwaysOnTop(true);

        panel.add(label);
        frame.add(panel);
        frame.pack();
    }

    private static void check(){ //updating label text
        if(run){ //if not paused
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while(run){ //loop
                        label.setText(MouseInfo.getPointerInfo().getLocation().toString().replaceAll("java.awt.Point", "")); 
                        frame.setSize(label.getWidth() + 5, label.getHeight() + 5); //Adapt frame size to fit label
                    }
                }
            }).start();
        }
    }

    public void nativeKeyPressed(NativeKeyEvent e) {

    }

    public void nativeKeyReleased(NativeKeyEvent e) {
        switch(e.getKeyCode()){
            case 27: //close code (esc key)
                System.exit(0);
            case 80: //pause code (p key)
                run = !run;
                check();
            case 67: //copy code (c key)
                StringSelection ss = new StringSelection(MouseInfo.getPointerInfo().getLocation().toString().replaceAll("java.awt.Point", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("=", "").replaceAll("x", "").replaceAll("y", "").replaceAll(",", ", ")); //get mouse coordinates and set them as a StringSelection
                Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); //get the clipboard
                cb.setContents(ss, ss); //set what is copied to the current mouse coordinates
            break;
        }
    }

    public void nativeKeyTyped(NativeKeyEvent e) {

    }

    public static void main(String[] args){

        LogManager.getLogManager().reset(); //stop the annoying constant logging of GlobalScreen

        try {
            GlobalScreen.setEventDispatcher(new SwingDispatchService());
            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 MainClass());

        jframe(); //Run JFrame code
        check(); //Run check code

        SwingUtilities.invokeLater(new Runnable() { 
            @Override
            public void run() {
                new MainClass();
            }
        });
    }  
}

任何有关使用JNativeHook重新使用switch语句的帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

此代码可以解决您的问题。

  1. 我认为主要问题出在e.getKeyCode(),因为它在nativeKeyPressednativeKeyReleased上没有返回相同内容所以我将您的代码放在方法中{ {1}}

  2. 此外,我还会在视觉上指出您要按的是哪个键。

  3. 避免使用"魔术数字" (27,87,67谁能猜出这意味着什么?)我转换为字符串形式,我认为代码可读性得到了改善。

  4. 我将public void nativeKeyPressed(NativeKeyEvent e)指令放在每个案例块的末尾,如果你没有把代码传递给所有案例。

    break;