- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试组织 filter chain的 EventQueue.dispatchEvent .类似于 java.io.FilterInputStream或 javax.servlet.Filter .
找到 EventQueueDelegate.Delegate用于此目的?.. 但是如果 EventQueue.dispatchEvent
EventQueueDelegate.Delegate
中出现异常,它对此一无所知并且丑陋 java.awt.EventDispatchThread .handleException
出现在现场。
我也看过 EventQueue.dispatchEvent在链中调用。但它似乎不适合这个,因为这种方法是 protected ,它需要额外的手鼓舞蹈才能使事情正常进行,代码变得不那么可爱。
最佳答案
接下来是围绕 EventQueueDelegate.Delegate 手鼓跳舞...
AwtExceptionHandler.java
package example;
/**
* @see java.awt.EventDispatchThread#handleException(Throwable thrown)
*/
public interface AwtExceptionHandler {
void handle(Throwable t) throws Throwable;
}
FilterEventQueueDelegate.java
package example;
import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.lang.reflect.Method;
import java.util.ConcurrentModificationException;
import sun.awt.EventQueueDelegate;
/**
* Aims to organise filter chain of {@link EventQueueDelegate.Delegate}.
*
* <pre>
* private static final AwtResponsivenessMonitor instance = FilterEventQueueDelegate.chain(new AwtResponsivenessMonitor());
* </pre>
*
* @author Mykhaylo Adamovych
*/
public abstract class FilterEventQueueDelegate implements EventQueueDelegate.Delegate, AwtExceptionHandler {
public static final class ExceptionHandler {
private static AwtExceptionHandler currentExceptionHandler;
public void handle(Throwable t) throws Throwable {
currentExceptionHandler.handle(t);
}
}
private static final class SimpleFilterEventQueueDelegate extends FilterEventQueueDelegate {
private EventQueueDelegate.Delegate thirdPartyDelegate;
private Object thirdPartyExceptionHandler;
@Override
public void afterDispatch(AWTEvent arg0, Object arg1) throws InterruptedException {
if (thirdPartyDelegate != null)
thirdPartyDelegate.afterDispatch(arg0, arg1);
}
@Override
public Object beforeDispatch(AWTEvent arg0) throws InterruptedException {
if (thirdPartyDelegate != null)
return thirdPartyDelegate.beforeDispatch(arg0);
return arg0;
}
@Override
public AWTEvent getNextEvent(EventQueue arg0) throws InterruptedException {
if (thirdPartyDelegate != null)
return thirdPartyDelegate.getNextEvent(arg0);
return arg0.getNextEvent();
}
@Override
public void handle(Throwable t) throws Throwable {
if (thirdPartyExceptionHandler != null)
try {
Class<? extends Object> c = thirdPartyExceptionHandler.getClass();
Method m = c.getMethod("handle", new Class[] { Throwable.class });
m.invoke(thirdPartyExceptionHandler, new Object[] { t });
} catch (Throwable x) {
thirdPartyExceptionHandler = null; /* Do not try this again */
throw t;
}
else
throw t;
}
public void setEventQueueDelegate(EventQueueDelegate.Delegate delegate) {
thirdPartyDelegate = delegate;
}
public void setExceptionHandler(Object exceptionHandler) {
thirdPartyExceptionHandler = exceptionHandler;
}
}
public static <T extends FilterEventQueueDelegate> T chain(T delegate) {
synchronized (EventQueueDelegate.class) {
EventQueueDelegate.Delegate currentDelegate = EventQueueDelegate.getDelegate();
FilterEventQueueDelegate currentFilterDelegate = null;
if (currentDelegate instanceof FilterEventQueueDelegate)
currentFilterDelegate = (FilterEventQueueDelegate) currentDelegate;
else {
SimpleFilterEventQueueDelegate simpleFilterDelegate = new SimpleFilterEventQueueDelegate();
if (currentDelegate != null)
simpleFilterDelegate.setEventQueueDelegate(currentDelegate);
Object currentExceptionHandler = null;
try {
currentExceptionHandler = Class.forName(System.getProperty("sun.awt.exception.handler")).newInstance();
} catch (Exception e) {
}
if (currentExceptionHandler != null)
simpleFilterDelegate.setExceptionHandler(currentExceptionHandler);
System.setProperty("sun.awt.exception.handler", ExceptionHandler.class.getName());
currentFilterDelegate = simpleFilterDelegate;
}
delegate.setNext(currentFilterDelegate);
EventQueueDelegate.setDelegate(delegate);
if (EventQueueDelegate.getDelegate() != delegate)
throw new ConcurrentModificationException();
ExceptionHandler.currentExceptionHandler = delegate;
return delegate;
}
}
protected FilterEventQueueDelegate next;
@Override
public void afterDispatch(AWTEvent arg0, Object arg1) throws InterruptedException {
next.afterDispatch(arg0, arg1);
}
@Override
public Object beforeDispatch(AWTEvent arg0) throws InterruptedException {
return next.beforeDispatch(arg0);
}
@Override
public AWTEvent getNextEvent(EventQueue arg0) throws InterruptedException {
return next.getNextEvent(arg0);
}
@Override
public void handle(Throwable t) throws Throwable {
next.handle(t);
}
private void setNext(FilterEventQueueDelegate eventQueueDelegate) {
next = eventQueueDelegate;
}
}
AwtResponsivenessMonitor.java
package example;
import java.awt.AWTEvent;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
/**
* Monitors {@code EventDispatchThread} responsiveness.
* <p>
* Singleton is initialised on first access.
*
* @author Mykhaylo Adamovych
*/
public class AwtResponsivenessMonitor extends FilterEventQueueDelegate {
private static final class DeamonThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread result = new Thread(r);
result.setName(AwtResponsivenessMonitor.class.getSimpleName());
result.setDaemon(true);
return result;
}
}
private static final class NotResponsive extends RuntimeException {
private static final long serialVersionUID = -1445765918431458354L;
}
public static final long DEFAULT_RESPONSIVENESS_TIMEOUT_S = 2;
public static final long RESPONSIVENESS_WATCHDOG_MS = 50;
private static final AwtResponsivenessMonitor instance = FilterEventQueueDelegate.chain(new AwtResponsivenessMonitor());
public static AwtResponsivenessMonitor getInstance() {
return instance;
}
public static long getResponsivenessTimeout() {
return instance.responsivenessTimeoutMs.get();
}
public static void setResponsivenessTimeout(long timeoutMs) {
instance.responsivenessTimeoutMs.set(timeoutMs);
}
private final AtomicLong responsivenessTimeoutMs = new AtomicLong(TimeUnit.SECONDS.toMillis(DEFAULT_RESPONSIVENESS_TIMEOUT_S));
private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new DeamonThreadFactory());
private long eventDispatchStartTime;
private Thread currentWorkingThread;
public AwtResponsivenessMonitor() {
executor.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
checkResponsiveness();
}
}, RESPONSIVENESS_WATCHDOG_MS, RESPONSIVENESS_WATCHDOG_MS, TimeUnit.MILLISECONDS);
}
@Override
public synchronized void afterDispatch(AWTEvent arg0, Object arg1) throws InterruptedException {
eventDispatchStartTime = 0;
super.afterDispatch(arg0, arg1);
}
@Override
public synchronized Object beforeDispatch(AWTEvent arg0) throws InterruptedException {
eventDispatchStartTime = System.currentTimeMillis();
currentWorkingThread = Thread.currentThread();
return super.beforeDispatch(arg0);
}
private synchronized void checkResponsiveness() {
if (eventDispatchStartTime != 0 && currentWorkingThread != null && System.currentTimeMillis() > eventDispatchStartTime + responsivenessTimeoutMs.get()) {
Exception e = new NotResponsive();
e.setStackTrace(currentWorkingThread.getStackTrace());
e.printStackTrace();
currentWorkingThread = null;
}
}
@Override
public synchronized void handle(Throwable t) throws Throwable {
eventDispatchStartTime = 0;
super.handle(t);
}
}
AwtIdleTracker.java
package example;
import java.awt.AWTEvent;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.LockSupport;
import javax.swing.SwingUtilities;
import sun.awt.SunToolkit;
/**
* Tracks {@code EventDispatchThread} idleness.
* <p>
* Singleton is initialised on first access.
*
* @author Mykhaylo Adamovych
*/
public class AwtIdleTracker extends FilterEventQueueDelegate {
public static final long DEFAULT_IDLE_TIME_TO_TRACK_MS = 1000;
private static final long IDLE_TIME_WATCHDOG_MS = 10;
private static final AwtIdleTracker instance = FilterEventQueueDelegate.chain(new AwtIdleTracker());
public static AwtIdleTracker getInstance() {
return instance;
}
private volatile boolean inProgress;
private final AtomicLong lastDispatchTime = new AtomicLong(0);
@Override
public void afterDispatch(AWTEvent arg0, Object arg1) throws InterruptedException {
lastDispatchTime.set(System.currentTimeMillis());
inProgress = false;
super.afterDispatch(arg0, arg1);
}
@Override
public Object beforeDispatch(AWTEvent arg0) throws InterruptedException {
inProgress = true;
return super.beforeDispatch(arg0);
}
@Override
public void handle(Throwable t) throws Throwable {
lastDispatchTime.set(System.currentTimeMillis());
inProgress = false;
super.handle(t);
}
public boolean isIdle() {
return this.isIdle(DEFAULT_IDLE_TIME_TO_TRACK_MS);
}
public boolean isIdle(long idleTimeToTrackMs) {
return !inProgress && SunToolkit.isPostEventQueueEmpty() && System.currentTimeMillis() > lastDispatchTime.get() + idleTimeToTrackMs;
}
public void waitForIdle() {
waitForIdle(DEFAULT_IDLE_TIME_TO_TRACK_MS);
}
public void waitForIdle(long idleTimeToTrackMs) {
waitForIdle(idleTimeToTrackMs, TimeUnit.DAYS.toMillis(365));
}
public void waitForIdle(long idleTimeToTrackMs, long timeoutMs) {
if (SwingUtilities.isEventDispatchThread())
throw new IllegalAccessError();
long staleThreshold = System.currentTimeMillis() + timeoutMs;
while (!isIdle(idleTimeToTrackMs)) {
if (System.currentTimeMillis() > staleThreshold)
throw new RuntimeException("GUI still is not idle.");
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(IDLE_TIME_WATCHDOG_MS));
}
}
}
例子.java
package example;
import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import sun.awt.EventQueueDelegate;
public class Example {
public static class ThirdPartyEventQueueDelegate implements EventQueueDelegate.Delegate {
public static final void registerEventQueueDelegate() {
EventQueueDelegate.setDelegate(new ThirdPartyEventQueueDelegate());
}
@Override
public void afterDispatch(AWTEvent arg0, Object arg1) throws InterruptedException {
System.out.println("Third party even queue delegate was not broken.");
}
@Override
public Object beforeDispatch(AWTEvent arg0) throws InterruptedException {
return arg0;
}
@Override
public AWTEvent getNextEvent(EventQueue arg0) throws InterruptedException {
return arg0.getNextEvent();
}
}
public static class ThirdPartyExceptionHandler {
public static void registerExceptionHandler() {
System.setProperty("sun.awt.exception.handler", ThirdPartyExceptionHandler.class.getName());
}
public void handle(Throwable t) {
System.out.println("Third party Exception handler was not broken.");
}
}
private static boolean wasIdle = false;
private static boolean isFistTime = true;
public static synchronized void log(String msg) {
System.out.println(new SimpleDateFormat("mm:ss.SSS").format(new Date()) + "\t" + msg);
}
public static void main(String[] args) {
// let suppose there are some related stuff already
ThirdPartyExceptionHandler.registerExceptionHandler();
ThirdPartyEventQueueDelegate.registerEventQueueDelegate();
// initialise singletons, build filter chain
AwtIdleTracker.getInstance();
AwtResponsivenessMonitor.setResponsivenessTimeout(TimeUnit.SECONDS.toMillis(2));
testWaitForIdle();
// testSomeGui();
}
public static void testSomeGui() {
// some test with visible GUI
JFrame frame = new JFrame();
frame.setSize(300, 300);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true) {
boolean isIdle = AwtIdleTracker.getInstance().isIdle();
if (isFistTime || wasIdle != isIdle) {
isFistTime = false;
wasIdle = isIdle;
String msg = isIdle
? "idle"
: "busy";
log("system becomes " + msg);
}
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1));
}
}
public static void testWaitForIdle() {
// some long operation
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
log("task started");
// throw new RuntimeException();
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(5));
log("task finished");
}
});
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(100));
log("started waiting for idle");
AwtIdleTracker.getInstance().waitForIdle();
log("stopped waiting for idle");
}
}
关于java - Swing 中的事件调度过滤器链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8080018/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!