2016-12-02 100 views
0

我需要smartGWT Windows的标题是可编辑的。而且我必须动态地做到这一点,因为窗口的数量是可变的。使GWT窗口的标题可编辑

我进行如下:

1)创建用于窗户随机ID的列表中,当它们被加载

private String randomId = "title" + Random.nextInt(); 

2)I实现创建窗口的方法和设置其标题

@Override 
public final Canvas getCanvas() { 
    if (window == null) { 
     window = new Window(); 
     window.setTitle(getTitle(model)); 

3)

private String getTitle(E model) { 
     return "<span contenteditable=\"true\" style=\"cursor: text\" id=\"" + randomId + "\">" + model.getName() + "</span>"; 
} 

3)I调用一个方法的情况下,要编辑的窗口被点击

window.addDrawHandler(event -> setupTitleEditing(randomId)); 

4)予实现的方法如下:

private native void setupTitleEditing(String name)/*-{ 
    document.getElementById(name).bind('click', function() { 
     $(this).attr('contentEditable', true); 
     }).blur(function() { 
     $(this).attr('contentEditable', false); 
     }); 
}-*/; 

元件跨距认为是在步骤空4)即使它存在正确的ID(浏览器检查器)。

我的问题是:有没有一种直接的方法来在Java中使用GWT方法做到这一点?如果不是,我错了什么?

回答

1

我提出的解决方案仍然存在一些问题,但我可以告诉你你做错了什么,然后你可能会找到完整的解决方案。

在JSNI方法setupTitleEditing(String name)内,您应该使用$doc而不是document。其原因是,(被并通常)加载到帧(引自第11章,GWT在行动,第二版)

GWT应用程序可以是内 浏览器。这意味着document变量 的可见性得到了保证。 GWT提供了$doc JavaScript变量,它保证链接到标准document变量,而不管应用程序如何加载到浏览器中。

请注意由$doc.getElementById(name)返回的对象没有方法“绑定”或“模糊”。你必须做这个任务

$doc.getElementById(name).onclick = function(){ 
    $(this).attr('contentEditable', true); 
}; 

我实现了这个解决方案,我跑了它。我能够编辑标题,但不是没有麻烦。 <span>元素的光标不愿意出现。它总是让我在这里和那里做一系列的点击,最终调出光标,然后才能编辑标题。我不知道为什么,但它看起来像右键单击标题以获取上下文菜单,然后单击inspect element总是可以使光标显示出来。

P.S.您使用'smartgwt'而不是'gwt'标记了您的帖子,因为您问题中提到的窗口小部件类CanvasWindow属于SmartGWT而不是香草GWT。我对吗?有人编辑了您的标签,并用'gwt'代替'smartgwt'。我没有意识到,直到我浏览了GWT的javadoc,并发现它的Window类没有名称为addDrawHandler的方法,并且Window类也不是Canvas的子类。

虽然解决方案可能不是特定于SmartGWT的,但我建议您1)将标签添加回来,以便熟悉SmartGWT框架的人可能会出现并提供帮助,并且2)当您提到这些类时添加链接到类CanvasWindow

+0

是的,这是非常烦人的,我必须点击无处不在内容变得可编辑。任何人有关于如何去除这个错误的想法? –