Java Swingポップアップメニューとjlist

java jlist menu popup swing
Java Swingポップアップメニューとjlist

ここに私の問題があります:jListとポップアップメニューがあります。 jListを右クリックすると、ポップアップメニューが表示されます。 問題は、マウスが指しているjListアイテムが選択されないことです。 そして、私はそれがそれをしたいです。 リスト内のアイテムにカーソルを合わせて右ボタンを押すと、2つのことが起こります。 クリックしたアイテムを選択し、ポップアップメニューを表示します。

私はこれを試しました:

jLists.addMouseListener(new MouseAdapter() {

     @Override
     public void mousePressed(MouseEvent e) {
            jList.setSelectedIndex(jList.locationToIndex(e.getPoint()));
     }
});

jList.setComponentPopupMenu(jPopupMenu);

ただし、ポップアップメニューのみが表示されます。 この行を削除した場合:

jList.setComponentPopupMenu(jPopupMenu);

次に、右クリック選択が機能します(ただし、ポップアップメニューは表示されません)。

だから、これら2つの機能(両方)を機能させる最良の方法は何だと思いますか?

英語をありがとうございます。

  21  0


ベストアンサー

`setComponentPopupMenu`を実行しないでください。 「MouseAdapter」で以下を実行します。

public void mousePressed(MouseEvent e)  {check(e);}
public void mouseReleased(MouseEvent e) {check(e);}

public void check(MouseEvent e) {
    if (e.isPopupTrigger()) { //if the event shows the menu
        jList.setSelectedIndex(jList.locationToIndex(e.getPoint())); //select the item
        jPopupMenu.show(jList, e.getX(), e.getY()); //and show the menu
    }
}

これはうまくいくはずです。

*編集:*現在、コードは press`イベントと release`イベントの両方をチェックします。これは、マウスを押すと一部のプラットフォームがポップアップを表示し、リリース時には他のプラットフォームが表示されるためです。 詳細については、http://download.oracle.com/javase/tutorial/uiswing/components/menu.html#popup [The Swing tutorial]を参照してください。

27


引き続き「setComponentPopupMenu」を使用したい場合(クロスプラットフォームでポップアップのマウスとキーボードの呼び出しを処理するので便利です)、「JPopupMenu.show(Component、int、int)」をオーバーライドして適切なものを選択できます行。

JPopupMenu jPopupMenu = new JPopupMenu() {
    @Override
    public void show(Component invoker, int x, int y) {
        int row = jList.locationToIndex(new Point(x, y));
        if (row != -1) {
            jList.setSelectedIndex(row);
        }
        super.show(invoker, x, y);
    }
};

jList.setComponentPopupMenu(jPopupMenu);

ポップアップがキーボードから呼び出された場合(およびターゲットコンポーネントの getPopupLocation`もオーバーライドしない場合)、 JPopupMenu.show`で取得するx、yの位置がコンポーネントの中間点になることに注意してください。 この場合、既に選択範囲がある場合は、おそらく選択範囲を変更したくないでしょう。

キーボード対を解決するために私が思いついた解決策。 マウス呼び出しの問題は、 getPopupLocation`のオーバーライドでコンポーネントにクライアントプロパティを設定し、ポップアップを表示するときにチェックすることでした。 `getPopupLocation`の引数は、キーボードから呼び出されると null`になります。 コアコードは次のとおりです(おそらく、コンポーネントとそのポップアップメニューで使用可能なユーティリティクラスに実装されています)。

private static final String POPUP_TRIGGERED_BY_MOUSE_EVENT = "popupTriggeredByMouseEvent"; // NOI18N

public static Point getPopupLocation(JComponent invoker, MouseEvent event)
{
    boolean popupTriggeredByMouseEvent = event != null;
    invoker.putClientProperty(POPUP_TRIGGERED_BY_MOUSE_EVENT, Boolean.valueOf(popupTriggeredByMouseEvent));
    if (popupTriggeredByMouseEvent)
    {
        return event.getPoint();
    }
    return invoker.getMousePosition();
}

public static boolean isPopupTriggeredByMouseEvent(JComponent invoker)
{
    return Boolean.TRUE.equals(invoker.getClientProperty(POPUP_TRIGGERED_BY_MOUSE_EVENT));
}

次に、コンポーネントの `getPopupLocation`をオーバーライドします。

@Override
public Point getPopupLocation(MouseEvent event)
{
    return PopupMenuUtils.getPopupLocation(this, event);
}

そして、 JPopupMenu.show`のオーバーライドで isPopupTriggeredByMouseEvent`を呼び出して、ポップアップ位置で行を選択するかどうかを決定します(または、基礎となるコンポーネントにとって意味のあるアクション):

JPopupMenu jPopupMenu = new JPopupMenu() {
    @Override
    public void show(Component invoker, int x, int y) {
        int row = jList.locationToIndex(new Point(x, y));
        if (row != -1 && PopupMenuUtils.isPopupTriggeredByMouseEvent((JComponent) invoker)) {
            jList.setSelectedIndex(row);
        }
        super.show(invoker, x, y);
    }
};

9


タイトルとURLをコピーしました