如何獲取當前顯示在屏幕上的所有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