2011-04-05 66 views
0

最近在一个项目中,我看到另一个开发人员使用类名称作为引用调用JTree中的自定义节点,然后触发JFrame中心区域(约束:每个节点只有一个面板)的Panel显示。设计:使用类或实例引用?

我可以理解树中类名的使用,因为没有太多的显示正在进行。但是,我倾向于在树本身中使用一个实例,它也可以为JPanel创建动画。什么是最普遍的做法,哪种方法比另一种更合适?

编辑:根据要求添加代码。似乎我误解了一些事情,因为有一些脱钩。

枚举表示JPanels的一种硬编码注册表,当用户执行操作时显示JPanel。这就是我使用实际的类名称的意思。

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类的方法,它从enum中重新创建一个自定义JPanel。一个MouseAdapter/KeyListener的内部

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; 
} 

方法,获取某种模型对象:

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有没有什么有趣的,只是重现从模型类节点。

+3

我迷失在你的描述中。你可以发布一些粗略的代码或举个例子吗? – jzd 2011-04-05 18:15:44

+0

根据你的描述,我相信你正在混合“优雅”和“蹩脚”。代码将清除我对你所描述的技术的理解。 – DwB 2011-04-05 18:32:17

+0

哈哈,我应该工作我的描述技能。我已经添加了一些用于说明目的的代码:)。 – 2011-04-05 19:19:46

回答

1

这仍然有点难以遵循,但我相信你的方法可能会更好。如果存储的类实例也可以进行显示,那么这是一个很好的方法。

每当你添加一层“元” - 使用反射 - 你真的应该有一个很好的理由这样做,因为它稍微加密了你的代码。通常反射的最佳用途可能是从非java文本或xml文件中加载对象,即使这样它也有助于在单个工厂方法内隔离反射部分,并返回不使用任何进一步反射的实例化Java对象。

但要小心,优雅和蹩脚的话。通常人们称之为优雅的,我称之为“更隐秘”,蹩脚通常也是“更隐秘”。

即使您的代码写得有点长或无趣,您的目标应始终为“更易读”。其实我会说“完全正确”是最重要的,紧随其后的是“更易读”(这意味着一定程度的简洁,太多的代码可能难以阅读过于“优雅”的代码)。