2

別のコンポーネントがクリックされたときにポップアップメニューがまだ開いている場合、そのコンポーネントはイベントを取得しません。これは、ポップアップによって消費されている可能性があるためです。これは、一般的にすべてのJPopupmenuで発生します。これは、Windows LAF(Windows7)を搭載したJava7でのみ発生します。回避策はありますか?既知のバグですか?

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

public class Test
{
    public static void main(String[] s)
    throws Exception
    {
           String lookAnfFeelClassName = UIManager.getSystemLookAndFeelClassName();
           UIManager.setLookAndFeel(lookAnfFeelClassName);

           JMenu menu = new JMenu("TEST Menu");
           JMenuItem menuItem = new JMenuItem("Menu Item 1");

           JMenuBar menuBar = new JMenuBar();
           menu.add(menuItem);
           menuBar.add(menu);

           final JButton b = new JButton("Test");
           b.setBounds(5, 50, 60, 20);
           b.addActionListener(new ActionListener()
           {
                  public void actionPerformed(ActionEvent e)
                  {
                        //If the Menu is open when I press the button, the putton is not pressed 
                        //so I have to press it again. 
                        JOptionPane.showMessageDialog(b, "Button Pressed");
                  }
           }
           );

           JFrame frame = new JFrame();
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setSize(150, 150);
           frame.setJMenuBar(menuBar);
           frame.getContentPane().setLayout(null);
           frame.getContentPane().add(b);
           frame.setVisible(true);           
    }
}
4

1 に答える 1

1

これが問題を解決する魔法の線です:

UIManager.put("PopupMenu.consumeEventOnClose", Boolean.FALSE);

BasicPopupMenuUIクラスのソースコードを調べたところ、これが見つかりました。どうやらこの振る舞いは、コード内の次のコメントによると意図的な設計上の選択ですが、それは確かに私にはバグのように感じます。

            // Ask UIManager about should we consume event that closes
            // popup. This made to match native apps behaviour.

ちなみに、Java5と6でも発生します。

于 2014-02-28T21:25:17.170 に答える