Нахождение и извлечение компонента из его контейнера - PullRequest
0 голосов
/ 04 февраля 2012

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

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

У меня такой вопрос: когда пользователь проходит через API командной строки и переключает состояние настройки (статическое свойство / настройка, которая применяется ко всем открытым экземплярам моего приложения), я хотел бы обновить «флажок / unchecked "свойство в 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 (хотя я понимаю, что они работают только на "бинах") .

1 Ответ

1 голос
/ 04 февраля 2012

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

2) тогда вы можете ilements

  • add Action / ActionListener

           ActionListener al = new ActionListener() {
    
                public void actionPerformed(ActionEvent ae) {
                    if (myCheckBox.isSelected()) {
                        // something
                    } else {
                        // something
                    }
                }
            };
    
  • add ItemListener

    ItemListener itemListener = new ItemListener() {
    
        public void itemStateChanged(ItemEvent itemEvent) {
            if (Whatever) {
                // something
            }
        }
    };
    
...