Jen*_*der 22 java swing eventqueue
为了调试Swing应用程序中的奇怪行为,我想用我自己的实现替换AWT EventQueue.
这可能吗?怎么样?
万一你有兴趣:
实现将是一个围绕正常Eventqueue的简单包装器,进行一些日志记录.
我想要调试的问题是一个TableCellEditor,它可以在一个小的演示应用程序中正常工作,但是当放入真正的应用程序时,由于某些事件,会立即调用stopCellEditing.我希望能够访问该活动,以便了解它的来源.
ran*_*ath 24
EventQueue有一个名为push()的方法,可以完全按照你想要的方式执行.这是一个小小的演示:
public class QueueTest {
public static void main(String[] args) throws InterruptedException, InvocationTargetException {
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new MyEventQueue());
EventQueue.invokeAndWait(new Runnable() {
public void run() {
System.out.println("Run");
}
});
}
private static class MyEventQueue extends EventQueue {
public void postEvent(AWTEvent theEvent) {
System.out.println("Event Posted");
super.postEvent(theEvent);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Jea*_*ana 15
小心java 1.7.有一个错误.由rancidfishbreath发布的解决方案对于java 1.6来说是完美的,但是导致Swing应用程序永远不会退出java 1.7.在JDK 1.7下,你必须在Event Dispatch线程中安装新的EvenQueue ...并在JDK 1.6之外安装它... ...写一次,到处运行;-)
这是一个通用的解决方案......希望,1.8不会改变它;-)
import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException;
public class QueueTest {
public static void main(String[] args) throws InterruptedException, InvocationTargetException {
if (!isJava7Like()) setQueue();
EventQueue.invokeAndWait(new Runnable() {
public void run() {
if (QueueTest.isJava7Like()) setQueue();
System.out.println("Run");
}
});
}
private static void setQueue() {
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new MyEventQueue());
}
private static boolean isJava7Like() {
return Float.parseFloat(System.getProperty("java.specification.version")) > 1.6;
}
private static class MyEventQueue extends EventQueue {
public void postEvent(AWTEvent theEvent) {
System.out.println("Event Posted");
super.postEvent(theEvent);
}
}
}
Run Code Online (Sandbox Code Playgroud)