最近在一个项目中,我看到另一个开发人员使用类名称作为引用调用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有没有什么有趣的,只是重现从模型类节点。
我迷失在你的描述中。你可以发布一些粗略的代码或举个例子吗? – jzd 2011-04-05 18:15:44
根据你的描述,我相信你正在混合“优雅”和“蹩脚”。代码将清除我对你所描述的技术的理解。 – DwB 2011-04-05 18:32:17
哈哈,我应该工作我的描述技能。我已经添加了一些用于说明目的的代码:)。 – 2011-04-05 19:19:46