コンポーネント名を参照する文字列から Swing コンポーネント ( JPanel や JButton など) を動的に作成するにはどうすればよいですか?
例えば;
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 in java how to eval a stringとCreation an instance from string in java . ただし、1 行で評価する場合は、独自のプリプロセッサを作成することもお勧めします。それが C/C++ プリプロセッサの機能です。