我正在创建一个简单的工具来检索当前的鼠标坐标,以帮助我编写未来的项目。我决定不下载一个,因为我想扩展我作为一个自学成才的程序员的知识。
我正在使用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语句的帮助表示赞赏!
答案 0 :(得分:3)
此代码可以解决您的问题。
我认为主要问题出在e.getKeyCode()
,因为它在nativeKeyPressed
和nativeKeyReleased
上没有返回相同内容所以我将您的代码放在方法中{ {1}}
此外,我还会在视觉上指出您要按的是哪个键。
避免使用"魔术数字" (27,87,67谁能猜出这意味着什么?)我转换为字符串形式,我认为代码可读性得到了改善。
我将public void nativeKeyPressed(NativeKeyEvent e)
指令放在每个案例块的末尾,如果你没有把代码传递给所有案例。
break;