import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

class MyJButton extends JButton implements ActionListener, Runnable {
    Thread thread;

    public MyJButton(String label) {
        super(label);
    }

    public Dimension getPreferredSize() {
        return new Dimension(300, 100);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        } else {
            thread = null;
        }
        FirstGUI.jf.pack();
        System.out.println(e.getActionCommand());
    }

    int num = 0;

    @Override
    public void run() {
        while (thread != null) {
            num++;
            setText("Second: " + num);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class MyThread extends Thread {

}

public class FirstGUI {
    static JFrame jf;

    public static void main(String[] args) {
        System.out.println("FirstGUI");

        jf = new JFrame("FirstGUI");

        MyJButton jb = new MyJButton("Label Label Label");

        // 古い書き方
        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(jb, "Button was pressed.");
            }
        });
        jb.addActionListener(jb);

        // ラムダ式 (Java 8以降) 引数の型は自動的に推論される
        jb.addActionListener(e -> System.out.println(e.getActionCommand() + " was pressed"));

        // メソッド参照（ラムダ式をさらに簡潔にしたもの）
        // 引数が1つで、その引数をそのままメソッドに渡す場合に使える（今回はActionEventをprintlnに送ってしまうので、すこし意味が異なる）
        jb.addActionListener(System.out::println); 

        jf.getContentPane().add(jb);
        // jf.setSize(300,200);
        jf.pack();
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    }
}
