import controlP5.*; /* ProcessingのライブラリcontrolP5のListBoxを拡張するためのクラス 拡張するための原因は、以下の動作を改善したかったためである。 (1) DropDownListとして使用する場合に、画面表示時に最初に項目が選択された状態にできない。 (2) アイテムを選択したときのマウスクリックイベントをPApplet.mouseClickedでも取得して、二重に処理をしているように見えてしまうため。 (3) アイテム間の間に1ピクセルの空白があり、その空白をクリックすると背面のクリック処理が走り、メニューがモーダルに見えないため。 それぞれの改善方法は次のようである。 (1) キャプションタイトルに、最初に選択されているアイテムの文字列を表示して、選択しているように見せる。 (2) アイテムを選択した直後には、このクラスで処理を行ったことを保存しておき、その事を親クラスでチェックしてからクリック処理を行う。 (3) アイテムを表示しているときは、isOpenメソッドで知ることができるため、Openしているときは、アイテムを表示している範囲内でのクリックはすべて親クラスでは処理を実施しないようにする。 また、以下の点が改善しようとしたができていないところである。 キャプションは小文字による表示が可能であったが、アイテムについては小文字表示ができない。valueLabel().toUpperCase()で可能であると思ったが、試したところできていない。 */ class ListBoxAd implements ControlListener{ private ControlP5 controlP5; private ListBox listbox; private int itemHeight = 15; private int itemGap = 1; private String[][] itemStrings; private boolean afterSelected = false; private java.awt.Point pos; private java.awt.Point w_size; private int selected = 0; private boolean changed = false; public ListBoxAd(processing.core.PApplet theParent,String[][] itemStrings,int x,int y,int w,int h){ controlP5 = new ControlP5(theParent); controlP5.addListener(this); this.itemStrings = itemStrings; this.pos = new java.awt.Point(x,y); this.w_size = new java.awt.Point(w,h); listbox = controlP5.addListBox(itemStrings[selected][0],this.pos.x,this.pos.y,this.w_size.x,this.w_size.y); listbox.setItemHeight(itemHeight); listbox.setBarHeight(itemHeight); listbox.captionLabel().toUpperCase(true); listbox.valueLabel().toUpperCase(false); for(int cnt=0;cnt y0+this.w_size.y){ y1 = y0+this.w_size.y; } if(x>=x0 && x<=x1 && y>=y0 && y<=y1){ return true; } } return false; } }