2012-10-21 82 views
1

如何从引用组件名称的字符串中动态创建Swing组件(例如JPanel或JButton)?从字符串创建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()要求要创建有一个默认的构造函数的组件,但是这是由大多数,如果不是所有的标准Swing提供组件。

+0

但是,我不知道它是什么类型。它可能是JButton – miqbal

+1

@miqbal:这就是String参数的来源。在那里使用一个变量,你的问题就解决了。 –

+0

@HovercraftFullOfEels:怎么样? – miqbal