Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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/JFace中缺少预选事件的任何解决方法?_Java_Swt_Jface - Fatal编程技术网

Java SWT/JFace中缺少预选事件的任何解决方法?

Java SWT/JFace中缺少预选事件的任何解决方法?,java,swt,jface,Java,Swt,Jface,在我的应用程序中,我希望用户在离开选项卡之前保存任何更改(实现为CTabFolder) 我试图处理SelectionEvent,但它在选项卡更改后触发(为什么它甚至有一个doit字段?对于其他控件,它在更改之前触发吗?) 看看Bugzilla,我找到了,而且两个都没有修复 由于这一要求可能很常见,有人有解决办法吗?我有一个与org.eclipse.ui.part.MultiPageEditorPart一起使用的解决办法,它由CTabFolder支持。我将对其进行调整,以实现直接的CTabFold

在我的应用程序中,我希望用户在离开选项卡之前保存任何更改(实现为
CTabFolder

我试图处理
SelectionEvent
,但它在选项卡更改后触发(为什么它甚至有一个
doit
字段?对于其他控件,它在更改之前触发吗?)

看看Bugzilla,我找到了,而且两个都没有修复


由于这一要求可能很常见,有人有解决办法吗?

我有一个与org.eclipse.ui.part.MultiPageEditorPart一起使用的解决办法,它由CTabFolder支持。我将对其进行调整,以实现直接的CTabFolder实现

首先,使用选择侦听器:

tabFolder.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        pageChange(tabFolder.indexOf((CTabItem) e.item));
    }
});
然后我实现pageChange(),如下所示:

protected void pageChange(int newPageIndex) {
    boolean changingPages = this.changingPages;
    this.changingPages = true;
    int oldPageIndex = tabFolder.getSelectionIndex();

    if (isDirty() && !changingPages) {
        tabFolder.setSelection(oldPageIndex);

        if (canChangePages()) {
            tabFolder.setSelection(newPageIndex);
        }
    }

    this.changingPages = false;
}
在canChangePages()中,我弹出一个“是否保存”对话框,让用户有机会选择“是”、“否”或“取消”。是保存信息并返回true。否将信息还原为上次保存的状态并返回true。Cancel只返回false。您可能只想尝试保存,只有在保存失败时才返回false


在调用canChangePages()之前切换回旧页面可能看起来很奇怪。这个调用执行得很快,所以它给人一种标签从未切换过的错觉。无论canChangePages()花费多长时间,用户都不会看到选项卡更改,除非该更改通过该方法批准。

我有一个解决方案,可用于org.eclipse.ui.part.MultiPageEditorPart,它由CTabFolder支持。我将对其进行调整,以实现直接的CTabFolder实现

首先,使用选择侦听器:

tabFolder.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        pageChange(tabFolder.indexOf((CTabItem) e.item));
    }
});
然后我实现pageChange(),如下所示:

protected void pageChange(int newPageIndex) {
    boolean changingPages = this.changingPages;
    this.changingPages = true;
    int oldPageIndex = tabFolder.getSelectionIndex();

    if (isDirty() && !changingPages) {
        tabFolder.setSelection(oldPageIndex);

        if (canChangePages()) {
            tabFolder.setSelection(newPageIndex);
        }
    }

    this.changingPages = false;
}
在canChangePages()中,我弹出一个“是否保存”对话框,让用户有机会选择“是”、“否”或“取消”。是保存信息并返回true。否将信息还原为上次保存的状态并返回true。Cancel只返回false。您可能只想尝试保存,只有在保存失败时才返回false


在调用canChangePages()之前切换回旧页面可能看起来很奇怪。这个调用执行得很快,所以它给人一种标签从未切换过的错觉。无论canChangePages()花费多长时间,用户都不会看到选项卡更改,除非该方法批准。

我为CTabFolders和Trees提出了相同的解决方法:)我预期会出现一些闪烁,但没有看到任何闪烁。幸运的是,CTabFolder确实在关闭选项卡之前触发了一个事件:)从2015年起,
tabFolder.getSelectionIndex()
将始终返回与
tabFolder.indexOf((CTabItem)e.item)相同的值。
。因此,
SelectionListener
中的
newPageIndex
始终等于
oldPageIndex
。如果有人对此有困难,请自行维护旧页面索引以克服此问题。我为CTabFolders和Trees提出了相同的解决方法:)我预期会出现一些闪烁,但没有看到任何闪烁。幸运的是,CTabFolder确实在关闭选项卡之前触发了一个事件:)从2015年起,
tabFolder.getSelectionIndex()
将始终返回与
tabFolder.indexOf((CTabItem)e.item)相同的值。
。因此,
SelectionListener
中的
newPageIndex
始终等于
oldPageIndex
。如果有人对此有困难,请自行维护旧页面索引以克服此问题。