Недавно в проекте я видел, как другой разработчик вызывал пользовательские узлы из JTree, используя имя класса в качестве ссылки, чтобы затем запустить отображение Panel в центральной области JFrame (ограничение: одна и только одна 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 не имеет ничего особенного и просто воссоздает узлы из классов модели.