如何获取当前显示在屏幕上的所有JPopupMenu组件的列表。
或者获取所有JPopupMenu组件,然后通过可见性,有效性等进行过滤。
我需要这个来编写测试。停留在JPopupMenu-s不是父子(容器 - 组件)关系的一部分。列出当前显示的所有JPopupMenu
谢谢。
解决:JPopupMenu的是窗口,它是在java.awt.Window.getWindows上市()
如何获取当前显示在屏幕上的所有JPopupMenu组件的列表。
或者获取所有JPopupMenu组件,然后通过可见性,有效性等进行过滤。
我需要这个来编写测试。停留在JPopupMenu-s不是父子(容器 - 组件)关系的一部分。列出当前显示的所有JPopupMenu
谢谢。
解决:JPopupMenu的是窗口,它是在java.awt.Window.getWindows上市()
JPopupMenu的是窗口,它是在java.awt.Window.getWindows()
对于所有的单元测试摆动我们使用的巨星框架。有一个弹出菜单夹具,可以让你测试弹出菜单上的东西。
https://github.com/alexruiz/fest-swing-1.x
使用框架,我相信你可以搜索与你JPopupMenu的设置名称搜索显示的所有弹出式菜单。编辑: 几年前,框架维护易手。使用前请检查。
上市作为评论表明这是不平凡的光重量级关切影响......例如,在某些情况下,JPopupMenu的可嵌套在JRootPane中。但是,在另一个公用API中可以使用 - javax.swing.MenuSelectionManager,它可以用来获取JPopupMenus的列表。我发现这里面javax.swing.plaf.basic.BasicPopupMenuUI.getPopups()
static List<JPopupMenu> getPopups() {
MenuSelectionManager msm = MenuSelectionManager.defaultManager();
MenuElement[] p = msm.getSelectedPath();
List<JPopupMenu> list = new ArrayList<JPopupMenu>(p.length);
for (MenuElement element : p) {
if (element instanceof JPopupMenu) {
list.add((JPopupMenu) element);
}
}
return list;
}
原使用的解决方案Window.getWindows()
private boolean isPopupMenuOpen() {
for (Window each : Window.getWindows()) {
if (findPopup(each) != null) {
return true;
}
}
return false;
}
private JPopupMenu findPopup(Component root) {
if (root instanceof JPopupMenu) {
return (JPopupMenu) root;
}
if (root instanceof JWindow) {
return findPopup(((JWindow)root).getContentPane());
}
if (root instanceof JRootPane) {
return findPopup(((JRootPane)root).getLayeredPane());
}
if (root instanceof Container) {
for (Component each : ((Container) root).getComponents()) {
return findPopup(each);
}
}
return null;
}
是否打算在您的Container迭代中立即返回第一个结果?我想你想要返回第一个非空结果 – Hachi
请注意:它显示在仅当它是重量级的,默认为一个单独的窗口,这仅仅是情况下,如果一个其部分区域不在其拥有者的顶级祖先之内。如果重量轻,则会显示在rootPane的layeredPane的弹出层中 – kleopatra
忘记了:想知道 - 您为什么期待几个弹出窗口?作为一般规则,只有一个弹出窗口(仍然需要找到:-)在任何给定时间都可见。这个规则的一个例外是子菜单 - 这可能就是你所追求的。最后,为什么问题似乎归结为:你想达到什么目的? – kleopatra