使GWT窗口的标题可编辑

时间:2016-12-02 15:49:27

标签: window smartgwt

我需要smartGWT Windows的标题可编辑。而且我必须动态地执行它,因为窗口的数量是可变的。

我继续如下:

1)我在加载窗口时为窗口创建一个随机ID列表

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

2)我实现了一个方法来创建窗口并设置其标题

@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)我调用一个方法来编辑窗口,以防它被点击

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中被认为是null,即使它存在正确的ID(浏览器检查器)。

我的问题是:使用GWT方法在java中有直接的方法吗?如果没有,我错了什么?

1 个答案:

答案 0 :(得分:1)

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

在JSNI方法setupTitleEditing(String name)中,您应该使用$doc代替document。原因是(引自第11章,GWT In Action,第2版)

  

GWT应用程序可以(并且通常是)加载到其中的框架中   浏览器。这意味着document变量的可见性   保证。 GWT提供了$doc JavaScript变量,它保证链接到标准document变量,无论应用程序如何加载到浏览器中。

请注意$doc.getElementById(name)返回的对象没有'bind'或'blur'方法。你必须做这个任务

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

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

P.S。您使用'smartgwt'而不是'gwt'为自己的帖子添加了标签,因为问题中提到的窗口小部件类CanvasWindow属于SmartGWT而不是GWT }。我对吗?有人编辑了您的代码,并将'smartgwt'替换为'gwt'。直到我通过GWT的javadoc并发现其Window类没有名为addDrawHandler的方法且Window类也不是子类时,我才意识到这一点Canvas

虽然解决方案可能不是SmartGWT特有的,但我建议你1)添加标签,以便熟悉SmartGWT框架的人可以提出并提供帮助,2)当你提到这些类时,添加链接到这些类{ {3}}和Canvas