2012-10-21 4 views
1

구성 요소 이름을 나타내는 문자열에서 동적으로 (예 : JPanel 또는 JButton) Swing 구성 요소를 만들 수 있습니까?문자열에서 Swing 구성 요소 만들기

예 :

String c = "JPanel"; 

(c) com = new (c)(); // It must be equivalent JPanel com = new JPanel(); 

또는 이와 유사한 기능;

Object c = Object.createObjectFromString(c); 

감사

+0

왜이 작업을 수행 하시겠습니까? 필요한 모든 유효성 검사는 코드를 읽을 수 없게 만듭니다. – Hidde

+0

이것이 리플렉션을 통해 수행 될 수 있다고 생각하지만 여기에 더 많은 상황을 제공 할 수 있습니까? 왜이 기능이 필요/필요합니까? –

+0

음,'Class.forName()'으로 처리 한 다음 적절한 생성자를 호출 할 수 있습니다. 그러나 왜 이것을 필요로할까요? –

답변

3

그것은 사용하여 수행 할 수있는 Reflection API : 어떤 시점에서

Class<?> klazz = Class.forName("javax.swing.JPanel"); 
JPanel panel = (JPanel) klazz.newInstance(); 

당신이 forName() 방법에 정규화 된 클래스 이름을 통과해야 공지 사항, 그것은 (에 대한 형식 매개 변수로 수 Class<?> 또는 위 코드에서와 같은 캐스트를 사용하여) 인스턴스화하려는 클래스를 명시 적으로 지정해야합니다. 인스턴스의 정확한 유형을 걱정하지 않는 경우 또는, 당신은 단순히이 작업을 수행 할 수 있습니다

Object obj = klazz.newInstance(); 

을 또한, 나는 클래스가없는 인수 생성자를 정의했다고 가정하고있다. 그런 경우가없는 경우 새 개체를 인스턴스화하기 전에 먼저 Constructor 객체를 생성해야합니다 :

Class<?> klazz = Class.forName("javax.swing.JPanel"); 
Constructor<?> constructor = klazz.getDeclaredConstructor(/* parameter types */); 
JPanel panel = (JPanel) constructor.newInstance(); 
2

당신은 반사 사용할 수 있습니다

// c is JPanel for instance 
Sting componentClassName = "javax.swing." + c; 
JPanel panel = (JPanel)Class.forName(componentClassName).newInstance(); 

Class.newInstance() 사용은 당신이 기본 생성자를 가지고 작성하는 구성 요소를 필요로하지만, 모든 표준 스윙 경우이 대부분에 의해 제공됩니다 구성 요소.

+0

그러나 나는 그것이 무엇인지 알지 못합니다. JButton – miqbal

+1

@miqbal 일 수 있습니다 : String 매개 변수가 들어있는 곳입니다. 변수를 사용하면 문제가 해결됩니다. –

+0

@HovercraftFullOfEels : 어떻게? – miqbal

관련 문제