2015-07-30 6 views
0

У меня есть JMenuBar, заполненный элементами меню, включая разделители. По умолчанию у меня отключен пункт меню «Сохранить», и теперь мне нужно включить его, если пользователь начинает вводить текст (в основном пользователь не может сохранить документ, если он его не изменил). Но моя проблема заключается в том, чтобы перебирать каждый элемент меню, чтобы изменить «Сохранить» с отключенного на включенное.Как определить, является ли jmenuitem разделителем

Я попытался использовать цикл вложенных циклов, чтобы получить имя на основе индекса, но получаю исключение, когда цикл попадает в разделитель.

int count = frame.getJMenuBar(). GetMenuCount();

for(int i = 0; i < count; i++) { 
    int itemCount = frame.getJMenuBar().getMenu(i).getItemCount(); 

    for (int j = 0; j < itemCount; j++) { 
     System.out.println(frame.getJMenuBar().getMenu(i).getItem(j).getAccessibleContext().getAccessibleName()); 
    } 
} 

В основном я пытаюсь, во втором цикле, проверить имя меню «Сохранить», а затем включить его таким образом. Я не хочу жестко кодировать индексы, пока я не изменю меню позже по дороге.

Я также пробовал вручную вводить индексы вместо использования циклов (вот как я узнал, что это было вызвано seperator.Так теперь, что я хочу сделать, это во втором цикле, проверьте, не является ли элемент menuitem является разделителем, но я не уверен, как это сделать. Я пробовал поиск в google и ничего не придумал. Любые предложения?

+0

Первое, что я хотел бы сделать, это использовать API 'Action', см. [Как использовать действия] (http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html) , 'JMenu' s сложны, поскольку они строят свой контент из информации, собранной из 'JMenuItem', и не склонны размещать их непосредственно на самом' JMenu' – MadProgrammer

+1

. Почему бы просто не ссылаться на меню 'Сохранить 'вместо это взломать? – Arvind

ответ

2

Проблема, с которой вы сталкиваетесь, происходит потому, что getItemCount возвращает разделители и элементы. Однако getItem() предполагает, что в данной позиции есть элемент. Вы можете использовать этот цикл, который проверяет, является ли элемент разделителем, поскольку оба значения JSeparator и JMenuItem распространяются от Component

for (int j = 0; j < itemCount; j++) { 
Component component = frame.getJMenuBar().getMenu(i).getMenuComponent(j); 

    if (component instanceof JSeparator) 
    { 
     //found a separator 
    } else if (component instanceof JMenuItem) 
    { 
     //found a menu item 
     System.out.println(((JMenuItem) component).getAccessibleContext().getAccessibleName()); 
    } 
} 
1

Самый простой способ - сохранить ссылку на кнопку «Сохранить» при ее создании. Тогда все, что вам нужно будет сделать, это

saveButton.setEnabled(true); 

вместо поиска в меню, чтобы найти кнопку.