这是另一种方法,即使不是很优雅,也算是不错的,据我所知,它是可行的。首先,在最顶部,我添加了一个名为的第二个布尔值
showPopup。
的
FocusListener必须如下:
menu.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { System.out.println("LOST FOCUS"); isShowingPopup = false; } @Override public void focusGained(FocusEvent e) { System.out.println("GAINED FOCUS"); isShowingPopup = true; } });该
isShowingPopup布尔没有得到改变其他地方-如果它获得焦点,它假定它表示,如果它失去焦点,它假定它不是。
接下来,
ActionListener按钮上的有所不同:
addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("isShowingPopup: " + isShowingPopup); if (showPopup) { Component c = (Component) e.getSource(); menu.show(c, -1, c.getHeight()); menu.requestFocus(); } else { showPopup = true; } } });现在出现了真正的新东西。这是一个
MouseListener按钮:
addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { System.out.println("ispopup?: " + isShowingPopup); if (isShowingPopup) { showPopup = false; } } @Override public void mouseReleased(MouseEvent e) { showPopup = true; } });基本上,
mousePressed在菜单失去焦点之前被调用,因此
isShowingPopup反映了是否在按下按钮之前显示了弹出窗口。然后,如果菜单在那里,我们将其设置
showPopup为
false,这样该
actionPerformed方法在调用菜单后(放开鼠标后)就不会显示菜单。
在每种情况下,它的行为均符合预期,但只有一种:如果显示菜单,并且用户在按钮上按下鼠标但将其释放到按钮外,
actionPerformed则永远不会调用。这意味着它
showPopup仍然为假,并且下次按下该按钮时不会显示菜单。要解决此问题,
mouseReleased方法将重置
showPopup。据我所知,该
mouseReleased方法在after之后被调用
actionPerformed。
我在结果按钮上玩了一点,对按钮做了所有我想得到的事情,并且按预期工作。但是,我不是100%肯定事件将始终以相同的顺序发生。
最终,我认为这至少值得一试。



