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