1

如何从引用组件名称的字符串动态创建 Swing 组件(例如 JPanel 或 JButton )?

例如;

String c = "JPanel";

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

或类似的功能;

Object c = Object.createObjectFromString(c);

谢谢

4

3 回答 3

3

可以使用反射 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();
于 2012-10-21T19:11:14.957 回答
2

你可以使用反射:

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

使用Class.newInstance()要求您正在创建的组件具有默认构造函数,但这由大多数(如果不是全部)标准 Swing 组件提供。

于 2012-10-21T19:10:35.233 回答
0

请参阅此处How to create an object from a string in java how to eval a stringCreating an instance from string in java。但是,如果您希望它在 1 行中进行评估,我也建议您编写自己的预处理器。这就是 C/C++ 预处理器所做的。

于 2012-10-21T19:17:49.620 回答