最近在一個項目中,我看到另一個開發人員使用類名稱作爲引用調用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