0

JPopupMenu私は作成してキーバインディングを割り当てる静的を持っています:

JMenuItem mItem = new MenuItem( "name" );
mItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_W, ActionEvent.CTRL_MASK ) );

これは、次のようにして にJPopupMenu追加されます。JTable

JTable table = new JTable();
table.add( popupMenu );

MouseListenerポップアップ メニューをトリガーするために、にも を追加しJTableます。

table.addMouseListener( mListener );

mouseReleased( MouseEvent me )次の方法で、ポップアップ メニューを表示するためのアクションを追加するためにオーバーライドします。

private void checkPopupTrigger( MouseEvent me )
        {
            if ( me.isPopupTrigger() )
            {
                JTable source = (JTable)me.getSource();
                int row = source.rowAtPoint( me.getPoint() );
                int column = source.columnAtPoint( me.getPoint() );

                if (! source.isRowSelected(row))
                    source.changeSelection(row, column, false, false);

                popupMenu.show( me.getComponent(), me.getX(), me.getY() );
            }

        }

私が抱えている問題は、最初のロード時にショートカットが正常に機能し、JPopupMenu を開かなくても機能するため、押したいショートカットが既にわかっている場合は右クリックしてメニューを表示する必要がないことです。右クリックしてポップアップ メニューが表示されると、ポップアップ メニューが表示されなくなるとショットカットが機能しなくなります。

インスタンスを (Eclipse IDE で) 調べるJTableと、実際にはJPopupMenu、次の行が呼び出された後にコンポーネントがテーブルから削除されているように見えます。

popupMenu.show( me.getComponent(), me.getX(), me.getY() );

この動作には理由がありますか? さまざまなアプローチの後、何が起こっているのかを知ることができないようです。私も使用してみました:

table.setComponentPopupMenu(myPopupMenu);

しかし、上記を実行すると、メニューは表示されますが、ポップアップメニューが表示されていない限り、ショートカットは機能しません。

それが割り当てられたキーバインディングに関連している可能性がある場合、私はWindows 8で実行しています。

と同様にセパレートを使用してこれを機能KeyListenerさせましたが、それはすべてのショートカットを2回、ポップアップで1回、セパレートでもう一度割り当てることを意味しました。だけで動作するようになった後、メニューが表示される前(および表示中)にのみショートカットが機能する理由を見つけられることを願っています。ポップアップ メニューの項目をクリックしなくても、メニューが非表示になるとショートカットが機能しません。JTableJPopupMenuKeyListenerJPopupMenu

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

4

1 に答える 1

3

しかし、上記を実行すると、メニューは表示されますが、ポップアップメニューが表示されていない限り、ショートカットは機能しません。

これは適切な動作です。アクセラレータは、コンポーネントが表示されている場合にのみ機能する必要があります。したがって、ポップアップが表示されない限り、アクセラレータは機能しません。

アクセラレータを常に動作させたい場合は、アクセラレータを含む JMenu および JMenuItem で JMenuBar を使用する必要があります。私がこのアプローチを気に入っているのは、アクセラレータごとに自己ドキュメントが提供されている場合です。

または、すべてのアクセラレータにキー バインディングを手動で追加する方法もあります。これは、JTable のすべてのデフォルト アクションが実装される方法です。

于 2013-11-08T16:21:35.807 に答える