Estoy tratando de encontrar una forma de seleccionar un elemento en un JMenu por su nombre. Básicamente, lo que quiero hacer es esto:
public boolean setEnableByName(boolean enable, String itemName) { for (Component item : myJMenu.getComponents()) { if (item.getName().equals(itemName)) { item.setEnabled(enable); return true; } } return false; } He intentado iterar en myJMenu.getComponents() o myJMenu.getMenuComponents() , sin éxito. He buscado el motivo y parece deberse a que JMenu no almacena directamente los submenús y los elementos directamente, es decir, no están realmente presentes.
Hay una pregunta similar sobre SO, pero data de 2012 y el swing tuvo muchos cambios.
Probé con un JMenu que contenía 2 JMenus y 2 JMenuItems. Los resultados que obtuve:
getComponents() : nunca ingreso el foreach (es decir, no se devuelven elementos)getMenuComponents() : obtengo los dos elementos JMenuNOTA : tenga en cuenta que no puedo usar este método ya que los elementos que activan la acción pueden estar en cualquier parte del código.
NOTA : A partir de las pruebas, descubrí que, para mi menú, getComponentsCount devolvió 0, getMenuComponentsCount devolvió 4, al igual que getItemsCount . Mi problema vino del hecho de que estaba comparando el name y no el text de mis elementos.
Supongo que está buscando JMenuItems y también que los agregó a su JMenu usando la función de add . En ese caso, podría usar las getItemCount() y getItem(int pos) como se muestra a continuación:
public boolean setEnableByName(boolean enable, String itemName) { for (int i = 0 ; i < myJMenu.getItemCount(); i++) { JMenuItem item = myJMenu.getItem(i); if (item.getName().equals(itemName)) { item.setEnabled(enable); return true; } } return false; }