package lecture.swing;

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

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

import jp.avaj.lib.debug.L;
import jp.avaj.lib.swing.PcScreen;

/** イベント処理の仕方 Swing Java */
class EventHandling {
/**
 *  画面に張り付けられたボタンなどが押下されたタイミングでイベント処理を行う必要がある。
 *  Swingのイベント処理の実装方法には、以下の方法がある。
 *  1.無名クラスで実装する
 *  2.内部クラスで実装する
 *  3.View自身が実装する
 *  4.外部クラスで実装する
 *
 * ・4.はViewと外部クラスのインターフェース用のメソッドを作成しなければならないので面倒
 *     => Viewのデータ取得やデータ設定のためのメソッドが必要なので.
 *
 * ・1.2.3.は同じような実装方法
 *  ・2.3.は複数の部品のイベントを扱わなければならないので、イベント元の部品によって、処理を振り分ける必要がある
 *  ・1.は、処理を振り分ける必要はないが、同じような処理が発生する可能性があり、その場合は共通化を図る必要がある
 *
 * ・4.以外の方法を推奨する
 */
  public static void main(String[] args) {
    new EventHandlingByMyself();
    new EventHandlingByAnonymousClass();
    new EventHandlingByInnerClass();
    new EventHandlingByOuterClass();
  }
  /**
   * イベント処理を自分自身で行うサンプル
   * イベントハンドラ(本例ではActionListener)をimplementsする
   * 本サイトのサンプルは、この方法で実装してある
   */
  static class EventHandlingByMyself extends JFrame implements ActionListener {
    private int myData = 0;
    private JButton btn;
    public EventHandlingByMyself() {
      setTitle("EventHandlingByMyself");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel mainPanel = new JPanel();
      getContentPane().add(mainPanel);
      mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS));
      //
      btn = new JButton("push");
      mainPanel.add(btn);
      // 自分自身をリスナーとして設定する
      btn.addActionListener(this);
      //
      pack();
      PcScreen.display(this,PcScreen.POS_TOP_LEFT);
      setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
      JComponent comp = (JComponent)e.getSource();
      // ボタンなどは普通は複数個あるので、判定が必要
      if (comp == btn) {
        L.p("button pushed");
        // 自オブジェクトの変数に自由にアクセスできる
        L.p("myData="+myData);
      }
    }
  }
  /**
   * イベント処理を無名クラスで行うサンプル
   */
  static class EventHandlingByAnonymousClass extends JFrame {
    private int myData = 0;
    public EventHandlingByAnonymousClass() {
      setTitle("EventHandlingByAnonymousClass");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel mainPanel = new JPanel();
      getContentPane().add(mainPanel);
      mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS));
      //
      // ボタンをインスタンス変数としなくてもよい
      JButton btn = new JButton("push");
      mainPanel.add(btn);
      btn.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent ev) {
            L.p("button pushed");
            // 自オブジェクトの変数に自由にアクセスできる
            L.p("myData="+myData);
          }
        }
      );
      //
      pack();
      PcScreen.display(this,PcScreen.POS_TOP_RIGHT);
      setVisible(true);
    }
  }
  /**
   * イベント処理を内部クラスで実装するサンプル
   */
  static class EventHandlingByInnerClass extends JFrame {
    private int myData = 0;
    private JButton btn;
    public EventHandlingByInnerClass() {
      setTitle("EventHandlingByInnerClass");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel mainPanel = new JPanel();
      getContentPane().add(mainPanel);
      mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS));
      //
      btn = new JButton("push");
      mainPanel.add(btn);
      btn.addActionListener(new EventHandler());
      //
      pack();
      PcScreen.display(this,PcScreen.POS_BOTTOM_LEFT);
      setVisible(true);
    }
    class EventHandler implements ActionListener {
      public void actionPerformed(ActionEvent e) {
        JComponent comp = (JComponent)e.getSource();
        // ボタンなどは普通は複数個あるので、判定が必要
        if (comp == btn) {
          L.p("button pushed");
          // 自オブジェクトの変数に自由にアクセスできる
          L.p("myData="+myData);
        }
      }
    }
  }
  /**
   * イベント処理を外部クラスで実装するサンプル
   */
  static class EventHandlingByOuterClass extends JFrame {
    private JButton btn;
    private int myData = 0;
    public EventHandlingByOuterClass() {
      setTitle("EventHandlingByOuterClass");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel mainPanel = new JPanel();
      getContentPane().add(mainPanel);
      mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS));
      //
      btn = new JButton("push");
      mainPanel.add(btn);
      btn.addActionListener(new OuterEventHandler(this));
      //
      pack();
      PcScreen.display(this,PcScreen.POS_BOTTOM_RIGHT);
      setVisible(true);
    }
    public JButton getButton() {
      return btn;
    }
    public int getMyData() {
      return myData;
    }
  }
  static class OuterEventHandler implements ActionListener {
    private EventHandlingByOuterClass parent;
    public OuterEventHandler(EventHandlingByOuterClass parent) {
      this.parent = parent;
    }
    public void actionPerformed(ActionEvent ev) {
      JComponent comp = (JComponent)ev.getSource();
      // 画面のクラスのデータにアクセスするためには、画面クラスにgetterをつけたりする必要がある
      if (comp == parent.getButton()) {
        L.p("button pushed");
        L.p("myData="+parent.getMyData());
      }
    }
  }
}
//---------------------------------------------------
//・目次 - Swing
//  http://blogs.yahoo.co.jp/artery2020/40568561.html
//・目次 - Java入門
//  http://blogs.yahoo.co.jp/artery2020/39975776.html
//・目次 - ビジネスパーソンの常識と非常識
//  http://blogs.yahoo.co.jp/artery2020/39728331.html
//・目次 - 論理・発想・思考についての考察と鍛え方
//  http://blogs.yahoo.co.jp/artery2020/39657784.html
//---------------------------------------------------