2013-10-27 5 views
0

모든 하위 클래스 멤버를 열거하고이를 개체에 추가하는 JComponentEx 클래스를 작성하고 싶습니다.'하위 클래스'생성자를 모두 처리하는 방법은 무엇입니까?

이 방법 나는

class MyComponent extends JComponentEx { 

    private JLabel mylabel = new JLabel(); 

    private JTextField mytext = new JTextField(); 

} 

을 쓸 수있을 것입니다 그리고 이것은 내가 스윙의 경우 원인이됩니다 몇 가지 문제를 이해

this.add(mylabel); 
this.add(mytext); 

에 자동으로 전화를하게됩니다. 내 질문은 원칙적으로 아이디어를 구현하는 방법입니다. 짧은 말로

UPDATE

, 나는 멤버 정의와 목록을 채우는합니다.

내가 생성자 내부에 추가를 실행하면 슈퍼 클래스 생성자는 서브 클래스의 인스턴스가 초기화 전에 실행되기 때문에, 내가 멤버를 볼 수 없습니다 2

UPDATE :

public class Try_Reflection_01 { 

    private final static Logger log = LoggerFactory 
      .getLogger(Try_Reflection_01.class); 

    public static interface IAutoAdd { 
    } 

    @SuppressWarnings("serial") 
    public static class JComponentEx extends JComponent { 

     public JComponentEx() { 
      updateComponents(); 
     } 

     protected void updateComponents() { 
      log.info("In updateComponents()"); 
      for (Field f : getClass().getFields()) { 

       try { 
        Object x = f.get(this); 
        log.info("Checking '{}' = {}", f.getName(), x); 
        if (x instanceof IAutoAdd) { 
         log.info("Adding"); 
         add((JComponent)x); 
        } 
        else { 
         log.info("Not adding"); 
        } 

       } catch (IllegalArgumentException e) { 
        log.error("Error getting member", e); 
       } catch (IllegalAccessException e) { 
        log.error("Error getting member", e); 
       } 

      } 
     } 
    } 

    public static class JMyComponent extends JComponentEx implements IAutoAdd { 
     public JLabel label = new JLabel("my label"); 
    } 

    public static void main(String[] args) { 
     JMyComponent component = new JMyComponent(); 
    } 
} 

출력

[main] INFO test.java.Try_Reflection_01 - In updateComponents() 
[main] INFO test.java.Try_Reflection_01 - Checking 'label' = null 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'WHEN_FOCUSED' = 0 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'WHEN_ANCESTOR_OF_FOCUSED_COMPONENT' = 1 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'WHEN_IN_FOCUSED_WINDOW' = 2 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'UNDEFINED_CONDITION' = -1 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'TOOL_TIP_TEXT_KEY' = ToolTipText 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'TOP_ALIGNMENT' = 0.0 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'CENTER_ALIGNMENT' = 0.5 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'BOTTOM_ALIGNMENT' = 1.0 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'LEFT_ALIGNMENT' = 0.0 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'RIGHT_ALIGNMENT' = 1.0 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'WIDTH' = 1 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'HEIGHT' = 2 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'PROPERTIES' = 4 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'SOMEBITS' = 8 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'FRAMEBITS' = 16 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'ALLBITS' = 32 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'ERROR' = 64 
[main] INFO test.java.Try_Reflection_01 - Not adding 
[main] INFO test.java.Try_Reflection_01 - Checking 'ABORT' = 128 
[main] INFO test.java.Try_Reflection_01 - Not adding 

답변

1

별도의 필드 대신 목록에 저장하십시오. 를 저장하는

for(JComponent comp : components){ 
this.add(comp); 
} 

대체 방법 : 당신이 그 (것)들에게 사용하고자 할 때

protected List<JComponent> components = new ArrayList<>(); 

// initializer 
{ 
components.add(new JLabel()); 
components.add(new JTextField()); 
} 

그리고

protected Map<String, JComponent> components = new HashMap<>(); 

{ 
components.put("inputfield", new JTextField()); 
} 

이것은 당신이 쉽게로 키를 사용하여 구성 요소를 수정할 수 있습니다 식별자.

당신은 정말이에 대한 반사를 사용하려면 :

public class MyComponent { 
    private JLabel mylabel = new JLabel(); 
    private JTextField mytext = new JTextField(); 

    private String someString; 

    public List<JComponent> getComponents() throws IllegalArgumentException, 
      IllegalAccessException { 
     Field[] fields = this.getClass().getDeclaredFields(); 

     List<JComponent> list = new ArrayList<>(); 
     for (Field field : fields) { 
      Object someField = field.get(this); 
      if (someField instanceof JComponent) { 
       list.add((JComponent) someField); 
      } 
     } 

     return list; 
    } 
} 

public class Test { 
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException{ 
     MyComponent comp = new MyComponent(); 
     System.out.println(comp.getComponents().size()); 
    } 
} 

출력 :

2

+0

JComponent와 같이 이미 목록에 저장되어 있습니다. 이제 멤버 선언으로이 목록을 채우고 싶습니다. –

+0

@SuzanCioc : '회원 선언'은 무엇을 의미합니까? –

+0

그 줄'private JLabel label = new JLabel();'이 자동으로'add (label)'를 명시 적으로 쓸 필요없이 기본 목록에'label'을 자동으로 추가합니다. –

0

당신은 사용해야합니다 반사 - 뭔가 같은 :

for(Field f: getClass().getFields()) { 
    Object x = f.get(this); 
    if(x instanceof JComponent) add(x); 
} 

내가 공개 한 분야에만 주어진 것만 큼; 비공개 필드에 액세스하는 것은 조금 까다 롭습니다. 보안 권한이 필요하므로 서명되지 않은 애플릿에서는 작동하지 않습니다.

+0

'getDeclaredFields()'는 비공개 필드에서도 작동합니다. 'getFields()'는 public 전용입니다. –

+0

예,하지만 수퍼 클래스에서이 작업을 수행하려고합니다. 따라서 하위 클래스에는 이에 대한 코드가 없습니다. –

+0

@ JeroenVannevel 감사합니다. –