如何从引用组件名称的字符串中动态创建Swing组件(例如JPanel或JButton)?从字符串创建Swing组件
例如;
String c = "JPanel";
(c) com = new (c)(); // It must be equivalent JPanel com = new JPanel();
或者类似这样的功能;
Object c = Object.createObjectFromString(c);
感谢
如何从引用组件名称的字符串中动态创建Swing组件(例如JPanel或JButton)?从字符串创建Swing组件
例如;
String c = "JPanel";
(c) com = new (c)(); // It must be equivalent JPanel com = new JPanel();
或者类似这样的功能;
Object c = Object.createObjectFromString(c);
感谢
这是可以做到,使用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();
您可以使用反射:
// 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。但是,如果你想让它在一行中进行评估,我还建议你编写你自己的预处理器。这就是C/C++预处理器所做的。
你为什么要这么做?所有你需要的验证都会让你的代码变得不可读。 – Hidde
我想这可以用反射来完成,但是你能在这里给我们更多的背景吗?为什么你需要/想要这个功能? –
那么,它可以用'Class.forName()'完成,然后调用适当的构造函数,但为什么你需要这个? –