Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTabbedPane 右クリックでタブが変わらないようにしたい。

タブ機能付きテキストエディターを作ろうとしていて、そのためにJTabbedPaneとJPopupMenuを使っています。
右クリックでポップアップメニューが出るようになったのはいいのですが、今選ばれてるタブと違うタブのところで右クリックするとメニューが開くだけでなくフォーカスがそのタブに当たってしまいます。
右クリックしたときにタブを切り替えずにポップアップメニューだけ出るようにしたいのですが、どうすればできるでしょうか?

試しにmouseClickedメソッドの先頭にevent.consume();を書いてみましたが、やはりそんな方法では対処できませんでした。

3

回答

93835

閲覧

3件の回答

評価

0

この動作はBasicTabbedPaneUIに埋め込まれており、
ComponentUIのイベント動作をTabbedPaneのようなクラス
でaddXXXListenerしようとしてもうまくインターセプトで
きないようですね。

そこで動作を変えるなら、より低レベルなマウスイベント
処理(JComponent.processEvent)のことろで右ボタンクリ
ックをインターセプトするのが比較的手軽な方法のように
思えます。

class MyTabbedPane extends JTabbedPane {
  ...
  @Override
  protected void processMouseEvent(MouseEvent e) {
    if (e.getID() == MouseEvent.MOUSE_PRESSED
          && ポップアップメニューを出すべきか(e)) {
      ポップアップを表示();
    } else {
       super.processMouseEvent(e);
    }
  }
  ...
}

「ポップアップメニューを出すべきか()」メソッドは、右
クリックかやポップアップメニューを出すべき位置かなど
を判定するように実装します。

これが適切な方法かどうかはそれほど自身ないのでより適
切な方法があればどなたかご指摘いただければ幸いです。

評価

0

以下のようなコードで試してみました。

@Override
protected void processMouseEvent(MouseEvent event) {
    if (event.getID() == MouseEvent.MOUSE_PRESSED
            && event.isPopupTrigger()) {
        System.out.println("ok");
    }
    else if (event.isPopupTrigger()) {
        System.out.println("okok");
        event.consume();
    } else {
        System.out.println("oh?");
        super.processMouseEvent(event);
    }
}

"ok"は出力されませんでしたが、"okok"は出力してくれました。
ですが、タブが切り替わってしまうのはconsumeをやっても変わりませんでした。
superの行をコメントアウトしてしまえばタブが切り替わることはありませんでしたが、もちろん左クリックしたときも切り替わらなくなりました。

イベントのIDなどについていろいろ調べてみた結果、以下のコードでうまくいきました。

@Override
protected void processMouseEvent(MouseEvent event) {
    if (event.getButton() == MouseEvent.BUTTON3) { //マウスの右が押されたら
        //ポップアップメニュー表示
    }
    else { //それ以外はそのまま
        super.processMouseEvent(event);
    }
}

ありがとうございました。

評価

0

タブの切り替えはMOUSE_PRESSEDで反応し、ポップアップは
MOUSE_RELEASEDで反応するため自分のサンプルコードでは不
適切なんですね。すみませんでした。

何にせよ解決策がみつかってよかったです。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。