2

Javaでアクションリスナーを介してボタンにポップアップを作成しようとしています。

私はいくつかのコードを持っていますが、私は近いと思いますが、それを動作させることができません! このコードは例からのものですが、Pmenu.show の場合、最初の引数を削除する必要があり、何に置き換えればよいかわかりません。これが問題のようです。

btnOptions.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                final JPopupMenu Pmenu = new JPopupMenu();
                  JMenuItem menuItem = new JMenuItem("Cut");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Copy");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Paste");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Delete");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Undo");
                  Pmenu.add(menuItem);
                  Point location = MouseInfo.getPointerInfo().getLocation();
                  Pmenu.show(null, location.getX(), location.getY());
            }
        });
4

2 に答える 2

3

ウィンドウのインスタンスを渡してみてください。(これ)。

ドキュメントによると、最初のパラメータは

invoker - the component in whose space the popup menu is to appear

そのため、ウィンドウにポップアップ メニューを表示します。

于 2012-07-23T01:44:40.790 に答える
2
Component source = (Component)evt.getSource();
Point location = MouseInfo.getPointerInfo().getLocation();
SwingUtilities.convertPointFromScreen(location, source
Pmenu.show(source, location.getX(), location.getY());

頭に浮かぶのは「なぜ?」という質問です。なぜこのようにするのですか?あなたが達成しようとしていることは何ですか?

更新 - ポップアップ オフセット

これにより、ポップアップがソース コントロール (ボタン) に対して水平方向の中央に配置され、その下に表示されます。

Component source = (Component)evt.getSource();
Point location = source.getLocation();
Dimension size = source.getSize();

int xPos = location.x + ((size.width - PMenu.getWidth()) / 2;
int yPos = location.y + size.height;
Pmenu.show(source, xPos, yPos);

もちろん、これは単なる例です。必要に応じてレイアウト情報を提供できます。

ワーキングアップデート

    Component source = (Component)evt.getSource(); 
    Dimension size = source.getSize(); 

    int xPos = ((size.width - Pmenu.getPreferredSize().width) / 2); 
    int yPos = size.height;

    Pmenu.show(source, xPos, yPos);

ポップアップの場所はソースに対して相対的であるため、ソースの場所情報は必要ありません

于 2012-07-23T04:27:13.167 に答える