Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何判断SWT外壳程序是以编程方式关闭的还是由用户关闭的?_Java_Event Handling_Swt - Fatal编程技术网

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,您可能会发现任何差异。如果找不到任何差异,则不确定是否有任何解决方法。