Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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 从GWT Activity.mayStop()响应捕获“取消”选择_Java_Events_Gwt_Android Activity - Fatal编程技术网

Java 从GWT Activity.mayStop()响应捕获“取消”选择

Java 从GWT Activity.mayStop()响应捕获“取消”选择,java,events,gwt,android-activity,Java,Events,Gwt,Android Activity,我有一个GWT两列显示器。左列包含一个CellTable,其中包含应用程序中的用户列表。当用户从列表中选择一个用户时,右侧列将显示所选用户的详细信息,用户可以对其进行编辑 我已将我的活动连接到使用mayStop方法,以便在切换用户之前,系统将尝试保存用户所做的任何未保存的更改-只要没有验证错误 我的问题是关于是否存在验证错误的行为。我已连线要求用户放弃未保存的编辑或返回页面并更正问题。我的问题是,当用户点击cancel返回并更正错误时,单元格表仍会选择新用户,而不是选择detail列中的用户。似

我有一个GWT两列显示器。左列包含一个CellTable,其中包含应用程序中的用户列表。当用户从列表中选择一个用户时,右侧列将显示所选用户的详细信息,用户可以对其进行编辑

我已将我的活动连接到使用mayStop方法,以便在切换用户之前,系统将尝试保存用户所做的任何未保存的更改-只要没有验证错误


我的问题是关于是否存在验证错误的行为。我已连线要求用户放弃未保存的编辑或返回页面并更正问题。我的问题是,当用户点击cancel返回并更正错误时,单元格表仍会选择新用户,而不是选择detail列中的用户。似乎取消了从用户活动切换,但GWT仍在选择CellTable。是否有方法捕获取消选择或停止单元格表选择

从PlaceController的源来看,它触发了对mayStop和onStop的最终调用,调用了两个不同的事件,每个事件调用一个。PlaceChangeRequestEvent位于第一位,可预见地指示正在请求更改,但尚未完成。这将呼叫mayStop

然后,如果用户没有选择取消更改,PlaceChangeEvent将被触发,并调用onStop。否则,这将永远不会被调用

我的方法是根据这些事件在左列中进行实际选择。没有一种简便的方法可以停止/取消选择,因此没有很好的方法来实际管理选择,并在用户提供反馈后延迟选择。我的想法是

当用户单击时,不要实际选择,只影响位置更改。然后,当PlaceChangeEvent被激发时,实际进行选择。这有点恶心,因为我看不到取消选择的方便方法。或 在用户更改所选内容(而不是位置)后,跟踪最后选定的元素。侦听PlaceChangeRequestEvent,并安排一个延迟命令来选择该原始项,侦听PlaceChangeEvent以跳过该命令的正文。这应该是可行的,因为呈现给用户的警报是阻塞的——不过我还没有实际测试它。
如果要将位置更改关联到url,则已经需要一个PlaceChangeEvent处理程序来监视用户单击浏览器前进/后退按钮,因此在决定如何关联时,请记住-位置更改应该驱动选择,就像选择需要驱动位置一样,但是如果用户单击后退,并取消位置更改,则celltable应保留其原始选择。

查看PlaceController的源,它触发对mayStop和onStop的最终调用,调用两个不同的事件,每个事件一个。PlaceChangeRequestEvent位于第一位,可预见地指示正在请求更改,但尚未完成。这将呼叫mayStop

然后,如果用户没有选择取消更改,PlaceChangeEvent将被触发,并调用onStop。否则,这将永远不会被调用

我的方法是根据这些事件在左列中进行实际选择。没有一种简便的方法可以停止/取消选择,因此没有很好的方法来实际管理选择,并在用户提供反馈后延迟选择。我的想法是

当用户单击时,不要实际选择,只影响位置更改。然后,当PlaceChangeEvent被激发时,实际进行选择。这有点恶心,因为我看不到取消选择的方便方法。或 在用户更改所选内容(而不是位置)后,跟踪最后选定的元素。侦听PlaceChangeRequestEvent,并安排一个延迟命令来选择该原始项,侦听PlaceChangeEvent以跳过该命令的正文。这应该是可行的,因为呈现给用户的警报是阻塞的——不过我还没有实际测试它。
如果要将位置更改关联到url,则已经需要一个PlaceChangeEvent处理程序来监视用户单击浏览器前进/后退按钮,因此在决定如何关联时,请记住-位置更改应该驱动选择,就像选择需要驱动位置一样,但是如果用户单击后退,并取消位置更改,则celltable应保留其原始选择。

我刚刚完成了一个基于多个源输入的实现。这是我想出的对我有用的方法

对于HandleSelection,需要覆盖单元格小部件中的所有单元格以返回true,如下所示:

/**
 * This text cell is designed for use in cell widgets that are tied to Places
 * and thus need to have the Activity/Presenter manage the selection to allow
 * for a mayStop() rejection of the navigation (user clicks cancel at prompt).
 */
public class PlaceTextCell extends TextCell
{   
    @Override
    public boolean handlesSelection()
    {
        // So that the selection model won't change the selection automatically.
        return true;
    }
}
然后,您必须通过CellPreviewEvent处理选择事件,与SelectionChangeEvent不同,CellPreviewEvent在选择发生之前发生。我用 d是一个数据网格,但这也应该适用于CellTable

selectionDataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler<Dto>() {
    @Override
    public void onCellPreview(CellPreviewEvent<Dto> event) {
        if(Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK ||
       event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)
            {
            eventBus.fireEvent(new MySelectionChangeRequestEvent(event.getValue()));
        }
    }
});
因此,在选择这一新行之后,将触发另一个事件,以根据新选择更新UI的另一部分

当用户单击时,由 自定义单元格覆盖。 位置更改部分的效果由CellPreviewHandler和PlaceController.goToPlace处理。 其余的只是由您的活动和场所实现来处理。
我刚刚完成了一个基于多个来源输入的实现。这是我想出的对我有用的方法

对于HandleSelection,需要覆盖单元格小部件中的所有单元格以返回true,如下所示:

/**
 * This text cell is designed for use in cell widgets that are tied to Places
 * and thus need to have the Activity/Presenter manage the selection to allow
 * for a mayStop() rejection of the navigation (user clicks cancel at prompt).
 */
public class PlaceTextCell extends TextCell
{   
    @Override
    public boolean handlesSelection()
    {
        // So that the selection model won't change the selection automatically.
        return true;
    }
}
然后,您必须通过CellPreviewEvent处理选择事件,与SelectionChangeEvent不同,CellPreviewEvent在选择发生之前发生。我使用了DataGrid,但这也应该适用于CellTable

selectionDataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler<Dto>() {
    @Override
    public void onCellPreview(CellPreviewEvent<Dto> event) {
        if(Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK ||
       event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)
            {
            eventBus.fireEvent(new MySelectionChangeRequestEvent(event.getValue()));
        }
    }
});
因此,在选择这一新行之后,将触发另一个事件,以根据新选择更新UI的另一部分

当用户单击时,由 自定义单元格覆盖。 位置更改部分的效果由CellPreviewHandler和PlaceController.goToPlace处理。 其余的只是由您的活动和场所实现来处理。
很难提出任何具体的建议,因为您没有拿出任何真正的代码,但您可以扩展附加到CellTable的SelectionModel并覆盖setSelected。。。方法不调用super.setSelected。。。如果某个地方设置了特定的标志。同样,如果没有细节,很难提出可靠的建议,但这是你可以探索的一个方向。很难提出任何具体的建议,因为你没有拿出任何真正的代码,但你可以扩展附加到你的CellTable上的SelectionModel并覆盖setSelected。。。方法不调用super.setSelected。。。如果某个地方设置了特定的标志。同样,如果没有细节,很难提出可靠的建议,但这是一个可以探索的方向。