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

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

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


存储对checkboxmenuitem的引用。
遍历JMenu容器层次结构以找到checkboxmenuitem。


我不想使用方法1,因为在将来,如果我有更多这些复选框方法,那么我将不得不继续引用每个方法。

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

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


有没有更好/更有效的方法来在组件层次结构中查找组件?通常,有没有更好的方法来解决此问题(当我的应用程序中的属性值更改时更改jcheckboxmenuitem的状态),例如使用PropertyChangeListener(尽管我的理解是,这些仅适用于“ beans”) 。

最佳答案

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
        }
    }
};

08-04 21:25