MouseListenerを利用したダブルクリック

前ページの作品に、次の機能を追加します。
リストボックスをクリックで選択した時、そのクリック座標とその項目の位置(添え字)をラベルへ表示します。
またリストボックスの項目のダブルクリックで、その項目の文字列を テキストエリアのカーソル位置へ挿入します。
この機能追加は、前作品のクラス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メソッドで取得しています。

以下に上記プログラムのクラス図を示します。