[Work/Class/Java with Processing/4_SwingInProcessing]

アート系学生のためのJAVA with Processing - その4-2 ProcessingでJButtonを使うためのActionListener

導入

Procesingのスケッチ(PAppletを継承したクラス)で,SwingのJButtonを使うためにActionListenerインタフェースを実装したクラスを用意する必要があるが,これはスケッチ内にインナークラスを用意し,そのオブジェクトを生成することで行う.

コード

//SwingInProcessing_Button_Listener

import processing.awt.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// macOSのJavaのProcessing最新版はこれでうまくいかないこともあるので
// processing.awt.PSurfaceAWT.SmoothCanvas;
// も追加

void setup(){
  size(640, 480);
  Canvas canvas = (Canvas)surface.getNative();
  // macOSのJavaのProcessing最新版はこれでうまくいかないこともあるので
  // SmoothCanvas canvas = (SmoothCanvas)getSurface().getNative();
  // で置き換える

  JLayeredPane layeredPane = (JLayeredPane)canvas.getParent().getParent();

  
  JTextField textField = new JTextField("New Text Field");
  textField.setBounds(10, 360, 620, 20);
  
  // Generate Object Instance of Inner Class for ActionListener
  // ActionListenerインタフェースを実装するインナークラス(後述)の
  // オブジェクトインスタンスの生成
  MyButtonListener myButtonListener = new MyButtonListener();

  // インナークラスに作ったTextField登録関数を使って,TextFieldを登録
  myButtonListener.setTextField(textField);
  
  // ボタンを作って,場所とサイズを決める
  JButton button1 = new JButton("Button 1");
  button1.setBounds(10, 390, 100, 20);

  // このボタンの「アクションコマンド」文字列を指定する.
  // ここでは"button1_push"という文字列を指定している
  button1.setActionCommand("button1_push");
  //ボタンを,ActionListenerを実装したクラスのオブジェクトに登録する
  button1.addActionListener(myButtonListener);
  
  // Paneにテキストフィールドとボタンを追加
  layeredPane.add(textField);
  layeredPane.add(button1);
}

void draw(){
  ellipse(0,0,100,100);
}

// Inner Class for ActionListener
// ActionListenerを使うためのインナークラス
class MyButtonListener implements ActionListener {

  // Pointer of textField added JLayeredPane
  // スケッチの大元のTextFieldへの参照ポインタ変数
  JTextField textField;

  // その参照をsetup関数から登録するための登録関数
  void setTextField(JTextField textField){
    this.textField = textField;
  }
  
  //ActionListenerを使うための関数actionPerformed関数のオーバーライド
  @Override
  public void actionPerformed(ActionEvent e){
   String actionCommand = e.getActionCommand();
   if(actionCommand.equals("button1_push")){
    textField.setText("Button1 has been pushed");
   }
  }
  
}
SwingInProcessing_Button_Listener.pdeの実行結果.テキストフィールドとボタンが表示されている.

最初に実行すると,テキストフィールドとボタンが表示されている.

ボタンを押すと,ActionListenerを実装したインナークラス(ここではMyButtonListener)内部のactionPerformed関数が呼ばれる.あらかじめボタンを生成した時にあらかじめ決めておいた「アクションコマンド(setActionCommand関数で指定)」で指定したコマンド文字列が,actionPerformed関数が呼ばれた時に引数として付いてくるActionEventクラスのオブジェクトのgetActionCommand関数で取得できるので,コマンド文字列を場合分けして,テキストフィールドの文字を入れ替える処理を行い,以下のような状態となる.

SwingInProcessing_Button_Listener.pdeの実行結果でボタンを押したところ.テキストフィールドの中身が入れ替わっている.