Java 从组件容器中查找和检索组件

Java 从组件容器中查找和检索组件,java,swing,jcomponent,Java,Swing,Jcomponent,在基于swing的UI中,我有一个JMenuBar,其中包含一系列JMenu和JMenuItem对象。其中一个菜单项对象恰好也是JCheckBoxMenuItem 现在,虽然用户可以单击此JCheckBoxMenuItem来切换应用程序级别设置的状态,但用户(在我的应用程序中)也可以访问命令行API来更改应用程序设置。此命令行API的详细信息不相关 我的问题是:当用户通过命令行API并切换设置的状态(应用于我的应用程序的所有打开实例的静态属性/设置)时,我想更新JCheckBoxMenuItem

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

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

我的问题是:当用户通过命令行API并切换设置的状态(应用于我的应用程序的所有打开实例的静态属性/设置)时,我想更新JCheckBoxMenuItem上的“checked/unchecked”属性。为此,我可以:

  • 存储对checkboxmenuitem的引用
  • 遍历JMenu容器层次结构以查找checkboxmenuitem
  • 我不想使用方法1,因为在将来,如果我有更多的checkboxmenuitem,那么我将不得不保留对每个checkboxmenuitem的引用

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

    Component[] childComponents = menu.getComponents();
    for(Component c:childComponents)
    {
        if(c.getName().equals("nameOfTheCheckBoxMenuItem"))
        {
            componentFound = c;
        }
    }
    
    是否有更好/更有效的方法在组件层次结构中查找组件?是否有更好的方法来解决这个问题(当我的应用程序中的属性值发生变化时,更改jcheckboxmenuitem的状态),比如使用PropertyChangeListener(尽管我的理解是这些方法只适用于“bean”).

    1)我建议对多面板应用程序使用最好、最简单的解决方法

    2) 然后你就可以买些东西了

    • 添加/


    这个checkboxmenuitem名称的字符串值是如何演变成代码的,请解释一下那个部分?可能是,如果我的想法是这样的话,那么我想我可以用“setName”方法解释该怎么做。例如:JCheckBoxMenuItem aCheckBoxItem=new JCheckBoxMenuItem();aCheckBoxMenuItem.setName(“togglePropertyItem”);现在,有没有一种有效的方法来查找JCheckBoxMenuItem,而不必保留对它的引用。我的应用程序只是一个JFrame,它有一个工具栏/菜单栏/和一个内嵌在滚动窗格中的表格,滚动窗格内嵌在框架中的一个面板中。其次,ActionListener和ItemListener接口可以根据用户对UI控件所做的操作来执行操作,但我的问题是,如何在不保留对该UI控件的引用的情况下以编程方式访问组件并更改其状态。如果需要进一步澄清,请告诉我。@Siddhartha Shankar不确定您选择了什么,因为对我来说(我的观点和经验)将是不存在的。我不知道组件层次结构,如果您添加随机JComponent,那么请使用HierarchyListener,
           ActionListener al = new ActionListener() {
    
                public void actionPerformed(ActionEvent ae) {
                    if (myCheckBox.isSelected()) {
                        // something
                    } else {
                        // something
                    }
                }
            };
    
    ItemListener itemListener = new ItemListener() {
    
        public void itemStateChanged(ItemEvent itemEvent) {
            if (Whatever) {
                // something
            }
        }
    };