최근 프로젝트에서 나는 클래스 이름을 참조로 사용하는 JTree에서 다른 개발자가 사용자 정의 노드를 호출하여 JFrame의 중앙 영역에서 Panel의 표시를 트리거하는 것을 보았습니다 (제약 조건 : 노드 당 단 하나의 Panel).디자인 : 클래스 또는 인스턴스 참조를 사용 하시겠습니까?
계속 진행되는 표시가 많지 않으므로 클래스 이름 사용을 이해할 수 있습니다. 그러나 JPanel을 움직일 수있는 트리 자체의 인스턴스를 사용하는 경향이 있습니다. 가장 널리 퍼진 관행은 무엇이며 어떤 경우에는 다른 관행보다 더 적절하게 접근 하는가?
편집 : 요청시 코드가 추가되었습니다. 감추고있는 것의 약간이 있었던 것에 따라 나는 물건을 잘못 잊었던 것처럼 보인다.
enum은 사용자가 조작을 수행 할 때 표시되는 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;
}
}
enum에서 사용자 지정 JPanel을 다시 만드는 Swing 클래스를 포함하는 메서드입니다. 모델 객체의 일종을 가져 오는 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
귀하의 설명에 따르면, 나는 당신이 "우아하고"엉터리라고 생각합니다. 코드는 설명하는 기술에 대한 나의 이해를 명확하게합니다. – DwB
하하하. 설명 기술을 습득해야합니다. 일러스트레이션을 위해 몇 가지 코드를 추가했습니다 :). –