Java 如何判断SWT外壳程序是以编程方式关闭的还是由用户关闭的?
我知道我可以用这个代码来判断外壳何时关闭Java 如何判断SWT外壳程序是以编程方式关闭的还是由用户关闭的?,java,event-handling,swt,Java,Event Handling,Swt,我知道我可以用这个代码来判断外壳何时关闭 shell.addShellListener(new ShellAdapter() { @Override public void shellClosed(ShellEvent e) { System.out.println("closed"); } } 但是ShellEvent对象没有告诉我Shell是以编程方式关闭的还是用户单击X按钮时关闭的 有什么方法可以判断吗?我花了一些时间来区分关闭的Shell
shell.addShellListener(new ShellAdapter()
{
@Override
public void shellClosed(ShellEvent e)
{
System.out.println("closed");
}
}
但是ShellEvent
对象没有告诉我Shell是以编程方式关闭的还是用户单击X按钮时关闭的
有什么方法可以判断吗?我花了一些时间来区分关闭的
ShellEvent
是由用户生成的还是由系统生成的
检查两种情况下的shelvevent
后,通过shelvevent
的ObjectGraph,唯一具有不同值的变量是Display
类中的captureChanged
,其范围为default
下面的代码应该可以帮助您找到ShellEvent
shell.addShellListener(new ShellAdapter() {
@Override
public void shellClosed(ShellEvent e) {
Field f = Display.class.getDeclaredField("captureChanged");
f.setAccessible(true);
System.out.println("captureChanged = " + f.get(e.display)); //true = If User triggered the Event
System.out.println("closed");
}
});
你能向我们解释一下你的用例吗?我不明白你为什么要知道。无论在哪里调用
shell.close()
,您就不能只做您想做的事情吗?我尝试了几种方法来解决这个问题。问题在于,无论以何种方式关闭Shell,它都在调用org.eclipse.swt.widgets.Decorations.closeWidget()。恐怕没有别的办法了。我得到了以下异常:java.lang.NoSuchFieldException:captureChanged
@Baz我可以在org.eclipse.swt.win32.win32.x86_3.7.0.v3735b.jar
中找到它。其他平台的swt.jar
中可能缺少它。隐马尔可夫模型!!是的,我可以验证,它是windows库的一部分,但不是linux或osx库的一部分。@Marclopes如果您可以在您的环境中调试和检查这两种情况下的ShellEvent,您可能会发现任何差异。如果找不到任何差异,则不确定是否有任何解决方法。