从字符串创建Swing组件

时间:2012-10-21 19:08:24

标签: java swing

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

例如;

String c = "JPanel";

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

或类似的功能;

Object c = Object.createObjectFromString(c);

由于

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

你可以使用反射:

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

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

答案 2 :(得分:0)

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