我知道这在stackoverflow之前已经受到质疑,但我无法找到解决问题的方法。 我想从ButtonClick事件中分离一些代码,我在ButtonClick上动态创建节点并将它们添加到父AnchorPane。在我的节点上是按钮,我按钮上的这些事件是用CommandPattern处理的。我创建了不同的ButtonEvents,具体取决于我创建的节点。
目前正常运作的守则是:
@FXML
void addErosionNode(ActionEvent event){
DragNode nde = new DragNode();
/*
id = nde.getId();
name = new String("Erosion");
Erosion cmd;
cmd = new Erosion();
nodeList.add(new NodeList<String, String, Command>(name, id, cmd));
*/
setupNode(nde);
nde.setNodeWithTwoCircles();
}
但是我想把代码放在/ ** /里面另一个方法,所以我可以用setupNode(nde, name);
替换代码
尝试使用此方法:
public void setupNode(DragNode nde, String name){
id = nde.getId();
Class clazz;
className = new String ("application.bvfunc." + type);
//This will be e.g. application.bvfunc.Erosion which is the class I want to use
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
System.out.println("fail");
}
clazz cmd;
cmd = new clazz();
nodeList.add(new NodeList<String, String, Command>(name, id, cmd));
nde.nodeLayout();
rightAnchor.getChildren().add(nde);
buildDragHandlers();
}
但clazz
无法解析为某种类型。
如何替换
Erosion cmd;
cmd = new Erosion();
使用clazz
我使用我的节点名称创建?
像这样:
clazz cmd;
cmd = new clazz();
答案 0 :(得分:0)
替换
clazz cmd;
cmd = new clazz();
与
Command cmd = (Command) clazz.newInstance();
答案 1 :(得分:0)
您可以创建一个将其命令名称映射到构造函数的映射,而不是使用反射:
private static final Map<String, Supplier<Command>> commandMap = new HashMap<>();
static {
commandMap.put("Erosion", Erosion::new);
commandMap.put("Dilation", Dilation::new);
}
然后在你的其他代码中:
public void setupNode(DragNode nde, String name){
id = nde.getId();
Command cmd = commandMap.get(name).get(); // <-- Calls the constructor
nodeList.add(new NodeList<String, String, Command>(name, id, cmd));
nde.nodeLayout();
rightAnchor.getChildren().add(nde);
buildDragHandlers();
}