我正在使用gwt网格,我试图获取其上有onDoubleClick事件的单元格。因此,如果我正在使用onClickEvent,我将使用getCellForEvent(ClickEvent)并返回一个单元格。但该方法不接受DoublClickEvent。如何获得具有onDoubleClick的单元格??
答案 0 :(得分:1)
扩展Grid
并使用受保护的getEventTargetCell
从NativeEvent
而不是GwtEvent
获取单元格。
答案 1 :(得分:1)
我没想到那个NativeEvent的东西。我希望它可以跨浏览器移植。我的DataGrid有ClickableTextCells的扩展。 DClickableTextCell(双击“D”)对双击做出反应,Microsoft在500毫秒内定义为双击。
public class DClickableTextCell extends ClickableTextCell {
@Override
public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, Element parent,
String value, NativeEvent event, ValueUpdater<String> valueUpdater) {
String type = event.getType();
if ((valueUpdater != null) && type.equals("click")) {
if (DoubleClickTimer.getInstance().isTimerRunning()) {
event.preventDefault();
DoubleClickTimer.getInstance().stopTimer();
valueUpdater.update(value);
} else {
DoubleClickTimer.getInstance().startTimer();
}
}
}
}
如果DoubleClick计时器当前正在运行,则必须在第二次单击双击时进行此单击。如果DoubleClick计时器当前未运行,则可能是DoubleClick的第一次点击。启动计时器。以下是DoubleClickTimer的代码:
public class DoubleClickTimer {
private static DoubleClickTimer ref = null;
private DoubleClickTimer() {
}
public static DoubleClickTimer getInstance() {
if (ref == null) {
ref = new DoubleClickTimer();
}
return ref;
}
private boolean timerRunning = false;
private Timer timer = new Timer() {
@Override
public void run() {
timerRunning = false;
}
};
public void startTimer() {
if (!timerRunning) {
timer.schedule(500);
timerRunning = true;
}
}
public boolean isTimerRunning() {
return timerRunning;
}
public void stopTimer() {
timer.cancel();
timerRunning = false;
}
}
它可以工作,但现在我将考虑扩展DataGrid。问题是DataGrid引用了AbstractCellTable中的受保护方法,只要将DataGrid子类放在不同的包中,就无法访问这些方法。你也可以带上AbstractCellTable,但它会做出类似的引用,你最终会复制更多东西。
对event.preventDefault的调用会抑制双击的正常行为,即突出显示要单击的窗口小部件。由于整个DataGrid是一个小部件(单元格和列不是小部件),因此除非您阻止该默认行为,否则DataGrid中的每个文本都会被选中。
我不是专家,我想从人们那里得到关于我是否能做得更好的建议。但它有效,所以我提供它作为一个可能的答案。
答案 2 :(得分:0)
您需要扩展原始单元格。在构造函数中更改:
super("click", "keyup", "keydown", "blur");
至super("dblclick", "keyup", "keydown", "blur");
并在onBrowserEvent方法中更改:
if ("click".equals(type) || enterPressed)
至if ("dblclick".equals(type) || enterPressed)