Newer
Older
Zemi01 / src / main / java / info / istlab / Zemi01 / Launcher.java
@motoki miura motoki miura on 21 Jan 2023 2 KB 数学関連
package info.istlab.Zemi01;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Launcher extends JPanel implements ActionListener {
    String[] options;
    public static JFrame frame;
    private String packageName;

    public static void show(String[] opts, String packName) {
        JFrame jf = frame = new JFrame("Launcher");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jf.getContentPane().add(new Launcher(opts, packName));
        jf.pack(); // 内容物でサイズを自動設定する

        Dimension winSize = jf.getSize();
        jf.setLocation(centerOfScreen(winSize));
        jf.setVisible(true);
    }

    // ここで、画面中心にウィンドウ表示するため、いろいろ計算する
    public static Point centerOfScreen(Dimension winSize) {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        return new Point((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / 2);
    }

    public Launcher(String[] opts, String packName) {
        options = opts;
        packageName = packName;

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        for (String str : options) {
            JButton b = new JButton(str);
            b.addActionListener(this);
            add(b);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String clsname = e.getActionCommand(); // 押されたボタンのラベル文字列

        // 無駄にリフレクションAPIをつかって、クラス名からmainメソッドを起動してみる
        try {
            String packname;
            if (packageName != null)
                packname = packageName;
            else {
                // クラス名はパッケージ名を含めた名前が必要なので、このクラスのパッケージ名を取得する
                packname = Launcher.class.getPackageName();
            }
            System.out.println("クラス " + packname + "." + clsname + " のmainメソッドを呼びます。");
            Class<?> targetcls = Class.forName(packname + "." + clsname);
            Class<?>[] aarg = new Class[1];
            aarg[0] = String[].class; // 文字列の配列。探したいメソッドは main(String[] args)なので。

            Method main = targetcls.getMethod("main", aarg);
            String[] arg_for_invoke = new String[0];
            main.invoke(targetcls, new Object[] { arg_for_invoke });
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException
                | IllegalArgumentException | InvocationTargetException e1) {
            e1.printStackTrace();
        }

    }

}