从容器中查找和检索组件

时间:2012-02-04 15:30:29

标签: java swing jcomponent

在我基于swing的UI中,我有一个JMenuBar,它包含一系列JMenu和JMenuItem对象。其中一个菜单项对象也恰好是JCheckBoxMenuItem。

现在,虽然用户可以单击此JCheckBoxMenuItem以切换应用程序级别设置的状态,但用户(在我的应用程序中)也可以访问命令行API以更改应用程序设置。此命令行API的详细信息不相关。

我的问题是:当用户通过命令行API并切换设置的状态(适用于我的应用程序的所有打开实例的静态属性/设置)时,我想更新“已检查/未选中“JCheckBoxMenuItem上的属性”。要做到这一点,我可以:

  1. 存储对checkboxmenuitem的引用。
  2. 遍历JMenu容器层次结构以查找checkboxmenuitem。
  3. 我不想使用方法1,因为在将来,如果我有更多这些复选框,那么我将不得不挂起对每个方法的引用。

    方法2似乎很麻烦,因为我需要这样做:

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

    是否有更好/更有效的方法在组件层次结构中查找组件?是否有更好的方法可以解决这个问题(在我的应用程序中属性的值发生变化时更改jcheckboxmenuitem的状态),使用一个PropertyChangeListener(虽然我的理解是这些只适用于“bean”)

1 个答案:

答案 0 :(得分:1)

1)我建议使用CardLayout为multi_JPanel应用程序提供最好,最简单的解决方法

2)然后你就可以了。

  • 添加Action / 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
            }
        }
    };