如何从引用组件名称的字符串动态创建 Swing 组件(例如 JPanel 或 JButton )?
例如;
String c = "JPanel";
(c) com = new (c)(); // It must be equivalent JPanel com = new JPanel();
或类似的功能;
Object c = Object.createObjectFromString(c);
谢谢
可以使用反射 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();
你可以使用反射:
// c is JPanel for instance
Sting componentClassName = "javax.swing." + c;
JPanel panel = (JPanel)Class.forName(componentClassName).newInstance();
使用Class.newInstance()
要求您正在创建的组件具有默认构造函数,但这由大多数(如果不是全部)标准 Swing 组件提供。
请参阅此处How to create an object from a string in java how to eval a string和Creating an instance from string in java。但是,如果您希望它在 1 行中进行评估,我也建议您编写自己的预处理器。这就是 C/C++ 预处理器所做的。