最近在一个项目中,我看到另一个开发人员使用类名作为引用从JTree调用自定义节点,然后在JFrame的中心区域触发Panel的显示(约束:每个节点一个且只有一个Panel)
我可以理解树中类名的使用,因为没有太多的显示。但是,我倾向于在树本身中使用一个也可以为JPanel制作动画的实例。什么是最普遍的做法,在什么情况下,一种方法比另一种方法更合适?
编辑:根据要求添加代码。似乎我错误地记住了事情,因为有一些脱钩。
枚举表示JPanels的一种硬编码注册表,在用户执行操作时显示。这就是我使用实际类名的意思。
public enum RightEnum {
BLAH1(BLAH1.class, "BLAH1", "This is a custom JPanel"),
BLAH2(BLAH2.class, "BLAH2", "This is another custom JPanel")
// etc
private Class<? extends AbstractWidget> widgetClass;
private String key;
private String label;
RightEnum(Class<? extends AbstractWidget> widgetClass, String key, String label) {
this.widgetClass = widgetClass;
this.key = key;
this.label = label;
}
public String getLabel() {
return label;
}
public String getKey() {
return key;
}
public Class<? extends AbstractWidget> getWidgetClass() {
return widgetClass;
}
public static RightEnum getEnum(String key) {
if(key == null) {
return null;
}
for(RightEnum right : RightEnum.values()) {
if(right.key.equals(key)) {
return right;
}
}
return null;
}
}
包含Swing类的方法,该类从枚举中重新创建自定义JPanel。
private static AbstractWidget createWidget(Right right) throws Exception {
RightEnum rightEnum = RightEnum.getEnum(right.getKey());
Class<? extends AbstractWidget> widgetClass = rightEnum.getWidgetClass();
AbstractWidget widget = (AbstractWidget) widgetClass.newInstance();
widget.setRight(right);
return widget;
}
MouseAdapter / KeyListener内部取出某种模型对象的方法:
private void doOpenView() throws Exception {
NavigationTreeNode navNode = (NavigationTreeNode) CustomFrame.navigationMenu.getLastSelectedPathComponent();
if (navNode.isLeaf()) {
if(navNode.getObject() instanceof Right) {
Right right = (Right) navNode.getObject();
try {
CustomFrame.widgetContainer.createAndAddWidget(right);
} catch (Exception ex) {
throw ex;
}
}
}
}
实际的JTree没什么好处,只是从模型类中重新创建节点。
答案 0 :(得分:1)
这仍然有点难以理解,但我相信你的方法可能更好。如果存储的类实例也可以进行显示,那么这是一个很好的使用方法。
每当你添加一层“Meta” - 使用反射 - 你真的应该有一个很好的理由这样做,因为它会加密你的代码。反射的最佳用途可能是从非java文本或xml文件加载对象,即使这样,它也有助于隔离单个工厂方法中的反射部分,并返回不使用任何进一步反射的实例化java对象。 / p>
但要注意优雅和蹩脚的话。通常人们称之为优雅,我称之为“更隐秘”,而蹩脚的通常也是“更加神秘”。
你的目标应该始终是“更容易阅读”,即使你的代码写得更长一点也不那么有趣。实际上我说“完全因素”是最重要的,紧接着是“更易读”(这意味着某种程度的简洁,太多的代码可能像过于“优雅”的代码一样难以阅读)。