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
在处理 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