• ベストアンサー

どのコンポーネントでクリックされたか知りたい

Swingを勉強しているのですが どのコンポーネントでクリックされたか判定する方法はないでしょうか。 具体的にはJTableの1列目で右クリックすると add delete 2列目で右クリックすると clear のように列ごとにポップアップメニューを変更したいのですが可能でしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

1.まずJTableにaddMouseListenerでマウスリスナーを登録します。 2.リスナーのmouseClickedイベントでは次のような処理にします。 public void mouseClicked(MouseEvent e){  Object sourceObject = e.getSource();  if(sourceObject instanceof JTable){   //そのプラットフォームのポップアップメニュートリガーイベントであるかどうか   if(e.isPopupTrigger() ){    //イベント発生元のJTable    JTable jtable = (JTable)sourceObject;    //クリックされた座標をPointオブジェクトで取得    Point point = e.getPoint();    //マウスがクリックされた列のインデックスを取得    int columnIndex = jtable.columnAtPoint(point);    //マウスがクリックされた行のインデックスを取得    int rowIndex = jtable.rowAtPoint(point);    //何かの処理   }  } } ・何をしているかわかりやすいように、順を追ったコードにしました。 ・「列」の判定で何かをしたいのであれば、columnIndexを使えば行えます。 ※参考のために「行」の取得も行っています ・マウスボタンの判定はisPopupTrigger()で行っていますが、気に入らなければ  getButton() などで判定してください。 ・ダブルクリックなどクリック数の判定を加えたければgetClickCount() で判定できます。

その他の回答 (1)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

ActionListner を JTableに登録しているということでよいのかな? イベントが発生すると public void actionPerformed(ActionEvent ev) メソッドが呼び出されるが、この引数evには、呼び出し元が記憶されているので、以下のように切り分け可能。 Object src = ev.getSource(); if( src instanceof JTable){ int column_num = ((JTable)src).getSelectedColumn(); switch(column_num){ case 0: /* 1列目のときの処理, 配列添え字と同じく0番開始なので。 */ break; case 1: /* 2列目のときの処理 */ break; default : /* その他の列、または どの列も選択されていない時 */ } } あと、右クリックか左クリックかの識別を先にしておくことでできるでしょう。

関連するQ&A