MouseDown 事件时的图形信息

Figure information when MouseDown event

在处理 onMouseDown 事件时,是否有可能获取有关被单击的 Figure 的额外信息?我的意思是,在构建 Figure 时可以包含额外的变量。这将用于列表理解。例如,在构建 Treemap 时。

OnMouseDown 事件以一个闭包作为参数,原则上它可以捕获创建它的范围内的任何变量。

这是 http://tutor.rascal-mpl.org/Rascal/Libraries/Vis/Figure/Properties/onMouseDown/onMouseDown.html 文档中的示例代码,扩展了 "extra information":

import vis::KeySym;
s = "";
s2 = "";
extraInformation = "some additional info about the b box"; // definition of extra information
b = box(text(str () { return s; }),
    fillColor("red"),
    onMouseDown(bool (int butnr, map[KeyModifier,bool] modifiers) {
        s = "<butnr>" + extraInformation; // later use of extra information
        return true;
    }));

重要的是要了解 closure/lambda 捕获到 变量 的绑定,而不是它们的 。因此,如果捕获同一变量的其他代码更改了 extraInformation 变量的内容,则该变量的内容也会更改。在示例中,这发生在 s 变量上,但不会发生在 extraInformation 变量上,因为在初始声明后没有人对其赋值。

因此,请注意来自 for 循环和理解的绑定循环变量:它们总是以最终循环迭代的内容结束。要解决此问题,请引入一个额外的变量,如下所示:

boxes = [box(..., onMouseDown(..., bool (int butnr, map[KeyModifier,bool] modifiers) { use of var })) | x <- elements, var := x];

或者像这样:

boxes = for (x <- elements) {
   var = x;
   append box(..., onMouseDown(..., bool (int butnr, map[KeyModifier,bool] modifiers) { use of var }));
}

如果我们在闭包中使用 x 而不是 var,那么您的所有框都将具有相同的 x 值,这是 [=20= 的最后一个元素]. W