Поиск и извлечение компонента из его контейнера

В моем пользовательском интерфейсе на основе свинга у меня есть JMenuBar, который содержит серию объектов JMenu и JMenuItem. Одним из объектов пункта меню также является JCheckBoxMenuItem.

Теперь, хотя пользователь может щелкнуть этот JCheckBoxMenuItem, чтобы переключить состояние настройки уровня приложения, пользователь (в моем приложении) также имеет доступ к API командной строки для изменения настройки приложения. Детали этого API командной строки не имеют значения.

Мой вопрос заключается в следующем: когда пользователь проходит через API командной строки и переключает состояние настройки (статическое свойство/настройка, которая применяется ко всем открытым экземплярам моего приложения), я хотел бы обновить свойство «проверено/не проверено». в элементе JCheckBoxMenuItem. Для этого я могу:

  1. Сохраните ссылку на элемент checkboxmenuitem.
  2. Просмотрите иерархию контейнера JMenu, чтобы найти элемент checkboxmenuitem.

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

Метод 2 кажется громоздким, потому что мне нужно сделать:

Component[] childComponents = menu.getComponents();
for(Component c:childComponents)
{
    if(c.getName().equals("nameOfTheCheckBoxMenuItem"))
    {
        componentFound = c;
    }
}

Есть ли лучший/более эффективный способ найти компонент в иерархии компонентов? Может быть, есть лучший способ решить эту проблему в целом (изменение состояния jcheckboxmenuitem при изменении значения свойства в моем приложении), используя, скажем, PropertyChangeListener (хотя я понимаю, что они работают только на «beans») .


person eternaln00b    schedule 04.02.2012    source источник
comment
Как это строковое значение для nameOfTheCheckBoxMenuItem подходит к этому коду, просто объясните эту часть? Может быть, если то, о чем я думаю, так и есть, то, думаю, я могу объяснить, что делать.   -  person nIcE cOw    schedule 04.02.2012
comment
используя метод setName. Например: JCheckBoxMenuItem aCheckBoxItem = new JCheckBoxMenuItem(); aCheckBoxMenuItem.setName(togglePropertyItem); Теперь есть ли эффективный способ найти JCheckBoxMenuItem, не удерживая ссылку на него.   -  person eternaln00b    schedule 04.02.2012


Ответы (1)


1) Я бы предложил использовать CardLayout для самого красивого и простого обходной путь для приложения multi_JPanel

2) тогда вы можете реализовать

  • добавить Действие / ActionListener

           ActionListener al = new ActionListener() {
    
                public void actionPerformed(ActionEvent ae) {
                    if (myCheckBox.isSelected()) {
                        // something
                    } else {
                        // something
                    }
                }
            };
    
  • добавить ItemListener

    ItemListener itemListener = new ItemListener() {
    
        public void itemStateChanged(ItemEvent itemEvent) {
            if (Whatever) {
                // something
            }
        }
    };
    
person mKorbel    schedule 04.02.2012
comment
Я не работаю с приложением, которое имеет несколько панелей JPanel. Мое приложение представляет собой просто JFrame с панелью инструментов/меню/и таблицей, встроенной в панель прокрутки, встроенную в панель, которая находится в кадре. Во-вторых, интерфейсы ActionListener и ItemListener отлично подходят для выполнения действия на основе того, что пользователь делает с элементом управления пользовательского интерфейса, но мой вопрос заключается в том, как мне получить доступ к компоненту и программно изменить его состояние, не удерживая ссылку на этот элемент. Управление пользовательским интерфейсом. Пожалуйста, дайте мне знать, если потребуются дополнительные разъяснения. - person eternaln00b; 04.02.2012
comment
@Siddhartha Shankar не уверен, что вы пытаетесь, потому что для меня (мое мнение и опыт) было бы ерундой, не знаю ComponentHierarchy, если вы добавите случайный JComponent, затем используйте HierarchyListener, - person mKorbel; 04.02.2012