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