모든 하위 클래스 멤버를 열거하고이를 개체에 추가하는 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
JComponent와 같이 이미 목록에 저장되어 있습니다. 이제 멤버 선언으로이 목록을 채우고 싶습니다. –
@SuzanCioc : '회원 선언'은 무엇을 의미합니까? –
그 줄'private JLabel label = new JLabel();'이 자동으로'add (label)'를 명시 적으로 쓸 필요없이 기본 목록에'label'을 자동으로 추가합니다. –