2012-02-04 35 views
0

在我的基於swing的用戶界面中,我有一個JMenuBar,其中包含一系列JMenu和JMenuItem對象。其中一個菜單項對象也恰好是JCheckBoxMenuItem。查找並從容器中檢索組件

現在,雖然用戶可以單擊此JCheckBoxMenuItem以切換應用程序級別設置的狀態,但用戶(在我的應用程序中)也可以訪問命令行API以更改應用程序設置。這個命令行API的細節是不相關的。

我的問題是:當用戶通過命令行API並切換設置的狀態(一個靜態屬性/設置適用於我的應用程序的所有打開的實例)時,我想更新「checked /未選中「屬性的JCheckBoxMenuItem。爲此,我可以:

  1. 存儲對checkboxmenuitem的引用。
  2. 遍歷JMenu容器層次結構以找到checkboxmenuitem。

我不想使用方法1,因爲在將來如果我有更多的這些checkboxmenuitems,那麼我將不得不堅持對每一個引用。

方法2似乎麻煩,因爲我需要做的:

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

有沒有找到一個組件層次結構中的成分更好/更有效的方式?有沒有更好的方法來解決這個問題(一般來說,當應用程序中的屬性值發生變化時,改變jcheckboxmenuitem的狀態),使用PropertyChangeListener(儘管我的理解是這些只能在「bean」上工作) 。

+0

nameOfTheCheckBoxMenuItem這個字符串值是如何來到這個代碼的東西,只是解釋那部分?可能是,如果我在想的是這種情況,那麼我想我可以解釋做什麼。 – 2012-02-04 16:51:54

+0

使用「setName」方法。例如: JCheckBoxMenuItem aCheckBoxItem = new JCheckBoxMenuItem(); aCheckBoxMenuItem.setName(「togglePropertyItem」); 現在,有沒有一種有效的方式來找到JCheckBoxMenuItem,而無需堅持引用它。 – eternaln00b 2012-02-04 18:12:47

回答

1

1)我會建議使用CardLayout的最好和最簡單的解決方法multi_JPanel應用

2),那麼你可以imlements

  • 添加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 
         } 
        } 
    }; 
    
+0

我沒有使用具有多個JPanel的應用程序。我的應用程序只是一個帶有工具欄/菜單欄的JFrame和一個鑲嵌在面板中的嵌入在滾動窗格中的表格。其次,ActionListener和ItemListener接口可以根據用戶使用UI控件執行的操作,但是我的問題是,我應該如何訪問組件並以編程方式更改其狀態,而不必保留參考到那個UI控件。請讓我知道是否需要進一步澄清。 – eternaln00b 2012-02-04 18:08:09

+0

@Siddhartha Shankar不知道你在做什麼,因爲對我來說(我的觀點和經驗)會是非實在不知道的ComponentHierarchy,如果你隨機添加JComponent然後使用HierarchyListener, – mKorbel 2012-02-04 18:57:07