前ページの作品に、次の機能を追加します。
リストボックスをクリックで選択した時、そのクリック座標とその項目の位置(添え字)をラベルへ表示します。
またリストボックスの項目のダブルクリックで、その項目の文字列を
テキストエリアのカーソル位置へ挿入します。
この機能追加は、前作品のクラスTestFrm041を継承したTestFrm042のクラスに作成します。
リスト項目をクリックやダブルクリックください。
リストは、リスト内のクリックされた座標から、次のようにリスト内項目の添え字が得られます。
int クリックリスト項目添え字 = this.lst1.locationToIndex(座標);
しかしActionListenerインターフェイスのactionPerformedでは、
クリック座標を得ることができません。
クリックした時の座標を得るには、java.awt.eventパッケージのMouseListenerインターフェイスを実装します。
このインターフェイスには、マウスクリックなど、それに関連する5つの
イベント用メソッドが次のように宣言されています。
public interface MouseListener extends EventListener { // コンポーネントの上にマウスが移動して入ると呼び出す。 public void mouseEntered(MouseEvent e); // コンポーネント上でマウスボタンが押されると呼び出す。 public void mousePressed(MouseEvent e); // コンポーネント上でマウスボタンが離されると呼び出す。 public void mouseReleased(MouseEvent e); // コンポーネント上でマウスをクリックすると呼び出す。 public void mouseClicked(MouseEvent e); // コンポーネント上にマウスが移動して出ると呼び出す。 public void mouseExited(MouseEvent e); }
そして、これらメソッドの引数のMouseEvent eから、その時のマウス座標を次のように得ることができます。
Point p = e.getPoint();// Pointが座標x,yを管理するクラスです。
System.out.println( "(" + e.x + "," + e.y + ")" );
また、e.getClickCount()で、マウスクリック数が得られので、
れでダブルクリックかをどうかを調べることができます。
このMouseEventクラスの機能の調べてみましょう。
MouseListenerも、ActionListenerインターフェイスと同じで、
java.awt.Componentクラスへのインターフェイスとして作られています。
Componentクラスは、ほとんどのGUI部品のスーパークラスになっているクラスで、
JListクラスとの関係は次のようになっています。
java.lang.Object
└java.awt.Component
└java.awt.Container
└javax.swing.JComponent
└javax.swing.JList
よってJListクラスオブジェクトの上で、これらマウス操作を行うと、このインターフェイスのメソッドを
呼び出すことができます。
あとは、MouseListenerインターフェイスを適宜なクラスに実装(implements)して、
そのオブジェクトのメソッドが、マウス操作で呼び出されるようにJListへ設定するだけです。
ActionListenerの設定は、addActionListenerを使いましたが、
MouseListenerの設定は、addMouseListenerを使います。
以下にTestFrm041クラスで使えるlst1フィールドをマウスクリックした時、
TestFrm042に作ったメソッドを実行するように作るスケルトンコードを示します。
なお TestFrm042クラスは、TestFrm041を継承して作ることとします。
■■■■の部分を正しく直しましょう。
←正しく修正してからクリックください。
←わからない場合は、クリック
あとは、このスケルトンコードに希望の処理を肉付けすればよいことになります。
以下で、冒頭目標のプログラムを示します。
package test;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class TestFrm042 extends TestFrm041 implements MouseListener
{
public TestFrm042(){
this.lst1.addMouseListener(this);
}
public void mouseEntered(MouseEvent e){// コンポーネントにマウスが入ると呼び出されます。
}
public void mousePressed(MouseEvent e){// コンポーネント上でマウスボタンが押されると呼び出されます。
}
public void mouseReleased(MouseEvent e){// コンポーネント上でマウスボタンが離されると呼び出されます。
}
public void mouseClicked(MouseEvent e){//マウスクリック
java.awt.Point p = e.getPoint();//クリック位置座標を取得
int idx = this.lst1.locationToIndex(p);//クリック位置の項目を添え字取得
this.lbl1.setText(p.x + "," + p.y + "の座標クリックで、リスト内項目添え字は" + idx + "です");
if (idx == -1) return;//クリック位置が、リスト項目でない
String itemStr = (String)this.listModel.get(idx);//クリックしたリスト内項目の文字列
if (e.getClickCount() == 2){
//テキストエリアに挿入
int start = this.txtArea1.getSelectionStart();//テキストの選択位置スタート位置取得
int end = this.txtArea1.getSelectionEnd();//テキストの選択位置エンド位置取得
this.txtArea1.replaceRange(itemStr, start, end); //テキストの部分置き換え
}
}
public void mouseExited(MouseEvent e){//コンポーネントからマウスが出ると呼び出されます。
}
public static void main(String[] args){
new TestFrm042();
}
}
上記において、
テキストエリア(JTextArea)のカーソル位置へ挿入は、
テキストエリアのreplaceRangeによる置き換えメソッドで行っています。
置き換えする文字列は itemStrで、その範囲は、startからend番目の文字位置です。
その文字位置は、選択しているか、クリックの位置で、テキストエリアのgetSelectionStartと
getSelectionEndメソッドで取得しています。
以下に上記プログラムのクラス図を示します。