1

私の問題は、以下の例でJFrameを右クリックすると、JPopupMenuが表示されますが、JFrameの外側をクリックしても、メニューが消えないことです。JFrameのどこかをクリックして、予期された動作ではないJFrameを削除する必要があります。再現する手順は次のとおりです。

  1. Eclipseからウィンドウクラスを実行します(JFrameが表示されます)
  2. Eclipseワークスペースをクリックします(JFrameはフォーカスを失い、Eclipseの背後に隠れます)
  3. Eclipseを最小化する(JFrameが表示されます)
  4. マウスをJFrameの上に置き、右クリックします(Popupが表示されます)
  5. どこかをクリックします(JFrameまたはポップアップではありません)。ポップアップは消えません

OSX10.6.7とJavaフルバージョン1.6.0_24-b07-334を実行しています

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class test
{

static class window extends JFrame implements MouseListener,
        MouseMotionListener
{

    JPopupMenu popMenu;
    JPanel panel = new JPanel();

    Point location;
    MouseEvent pressed;

    public window()
    {

        addMouseListener(this);
        addMouseMotionListener(this);

        JLabel label = new JLabel("JFrame", JLabel.CENTER);

        initPopMenu();
        add(label);
        setUndecorated(true);
        setVisible(true);

        // setAlwaysOnTop(true);
        setLocationRelativeTo(null);
        pack();
    }

    public void initPopMenu()
    {
        popMenu = new JPopupMenu();
        JMenuItem item;

        item = new JMenuItem("Title");
        item.setEnabled(false);
        popMenu.add(item);
        popMenu.addSeparator();

        item = new JMenuItem("Item One");
        popMenu.add(item);

        item = new JMenuItem("Item 2");
        popMenu.add(item);

        item = new JMenuItem("Item 3");
        popMenu.add(item);
    }

    public void mousePressed(MouseEvent e)
    {
        pressed = e;
        int nModifier = e.getModifiers();
        if (((nModifier & InputEvent.BUTTON2_MASK) != 0)
                || ((nModifier & InputEvent.BUTTON3_MASK) != 0))
            popMenu.show( this, e.getX(), e.getY() );
    }

    public void mouseClicked(MouseEvent e)
    {
    }

    public void mouseReleased(MouseEvent e)
    {
    }

    public void mouseDragged(MouseEvent me)
    {
    }

    public void mouseMoved(MouseEvent e)
    {
    }

    public void mouseEntered(MouseEvent e)
    {
    }

    public void mouseExited(MouseEvent e)
    {
    }
}

public static void main(String[] args)
{
    window dw = new window();
}
}
4

1 に答える 1

0

windowFocusListenerを追加し、ウィンドウがフォーカスを失ったときにメニューを非表示にすることができます

        this.addWindowFocusListener(new WindowFocusListener() {
            @Override
            public void windowLostFocus(WindowEvent e) {
                if(popMenu != null){
                    popMenu.setVisible(false);
                }
            }
            @Override
            public void windowGainedFocus(WindowEvent e) {
                //System.out.println(e);
            }
        });
于 2011-07-23T14:05:11.420 に答える