我需要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中有直接的方法吗?如果没有,我错了什么?
答案 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'
为自己的帖子添加了标签,因为问题中提到的窗口小部件类Canvas
和Window
属于SmartGWT
而不是GWT
}。我对吗?有人编辑了您的代码,并将'smartgwt'
替换为'gwt'
。直到我通过GWT的javadoc并发现其Window
类没有名为addDrawHandler
的方法且Window
类也不是子类时,我才意识到这一点Canvas
。
虽然解决方案可能不是SmartGWT特有的,但我建议你1)添加标签,以便熟悉SmartGWT框架的人可以提出并提供帮助,2)当你提到这些类时,添加链接到这些类{ {3}}和Canvas。